Mercurial Subrepos-как вы их создаете и как они работают?

ситуация

у меня есть два .NET-решения (Foo и Bar) и общая библиотека, содержащая ProjectA, ProjectB и ProjectC. Foo и Bar ссылка на один или несколько проектов библиотеки, но проекты библиотеки не расположены в Foo и Bar папки решения.

каталог структуру:

-- My Documents*
   -- Development
      -- Libraries
         -- ProjectA
         -- ProjectB
         -- ProjectC
   -- Projects
      -- Foo
         -- Solution
            -- .hg
            -- .hgignore
            -- Foo { Project Folder }
            -- FooTests { Project Folder }
            -- Foo.sln { References ProjectA }
            -- Foo.suo
      -- Bar
         -- Solution
            -- .hg
            -- .hgignore
            -- Bar { Project Folder }
            -- BarTests { Project Folder }
            -- Bar.sln { References ProjectA and ProjectB }
            -- Bar.suo

*увы, я все еще использую Windows XP...

ртутный Subrepositories

цель - я хочу настроить subrepos, чтобы я мог хранить исходный код для любых ссылочных проектов библиотеки в моем Foo и Bar репозитории.

по данным на этой странице (это буквально единственная документация, которую я могу найти в subrepos), настройка subrepo требует выполнения следующих команд из окна консоли DOS:

1| $ hg init main
2| $ cd main
3| $ hg init nested
4| $ echo test > nested/foo
5| $ hg -R nested add nested/foo
6| $ echo nested = nested > .hgsub
7| $ hg add .hgsub
8| $ ci -m "initial commit"

вопросы

  1. можно ли выполнить любой или все эти шаги с помощью TortoiseHG, начиная с версии 0.9.2? Если да, то как? Я уверен, что строки 1-3 могут, но я не знаю о строках 4-7. Ничто из этого, по-видимому, не задокументировано в TortoiseHG.
  2. что делает вышеуказанный код (строка за строкой объяснение было бы очень признательно). Вот некоторые конкретные вопросы, которые пришли на ум, когда я пытался расшифровать он:
    • что значит > делать? Я попытался найти в Mercurial docs >, но ничего не нашел.
    • в строке 5, я не понимаю, что nested/foo есть. Где же foo откуда? Что такое foo? Хранилище? Папку?
    • строка 6 - это полностью сбивает меня с толку.
    • в строке 7, я предполагаю .hgsub добавляется к main? Или он добавляется в nested?
  3. Давайте я настройте мои подпредприятия и мой Bar репозиторий теперь до версии 10. Если я попытаюсь обновить свой рабочий каталог до версии 7, это вызовет мои папки библиотеки (My Documents/Development/Libraries/ProjectA и .../Libraries/ProjectB) обновить до того, что также хранится в версии 7?

обновление

я добавил 8-ю строку кода:ci -m "initial commit". Это делает две вещи: (1) добавляет .файл hgsubstate в основное РЕПО и (2) фиксирует все изменения, включая новый вложенный основной репозиторий (с сообщением "начальная фиксация"). Цель .файл hgsubstate должен отслеживать состояние всех вложенных репозиториев, поэтому, если вы вернетесь к более ранней версии, он также захватит правильную ревизию из всех вложенных репозиториев.


обновление 2 - инструкции

после дальнейших экспериментов, я думаю теперь я могу предоставить шаги для решения моей первоначальной проблемы (используя в основном Проводник Windows и TortoiseHG):

создание subrepo

  1. Libraries/ProjectA, Libraries/ProjectB, и основные репозитории (Projects/Foo/Solution и Projects/Bar/Solution) должны быть отдельные репозитории.
  2. открыть Projects/Foo/Solution.
  3. клон от Libraries/ProjectA to Projects/Foo/Solution.
  4. добавить ProjectA до Foo репозитория.
  5. используйте текстовый редактор для создания файла с именем .hgsub, содержащий следующий:

    ProjectA = ProjectA
    
  6. откройте окно консоли DOS и введите следующие команды (см. Примечание ниже):

    cd c:...ProjectsFooSolution
    hg ci -m "Committing subrepo "ProjectA"
    
  7. на Bar, шаги в основном те же, за исключением.hgsub файл должен содержать записи для обоих проектов, как это:

    ProjectA = ProjectA  
    ProjectB = ProjectB
    

Примечание: начиная с TortoiseHG 0.10 (который запланирован на март), вы сможете использовать HG Commit команда shell для этого, но пока, вы должны использовать командную строку.

как только все это настроено, становится немного легче.

фиксация изменений - для внесения изменений в Foo или Bar, ты Synchronize/Pull операция для каждого subrepo, чтобы получить subrepos в синхронизации с последними версиями в репозиториях проекта библиотеки. Затем вы снова используете командную строку для фиксации изменений (до версии 0.10, когда вы можете просто использовать TortoiseHG для совершать.)

Обновление рабочего каталога до более ранней версии - это, кажется, работает довольно нормально с TortoiseHG и, похоже, не требует использования каких-либо команд DOS. Чтобы действительно работать с более ранней версией в Visual Studio, вам нужно будет сделать Synchronize/Push операция для возврата старой версии проектов библиотеки в .

насколько мне нравится TortoiseHG для простых задач, вероятно, лучше писать пакетные файлы для часто используемые операции subrepo (особенно обновление).

надеюсь, это поможет кому-то в будущем. Если вы видите какие-либо ошибки, пожалуйста, дайте мне знать (или не стесняйтесь редактировать себя, если сможете).

2 ответов


вы, вероятно, могли бы попробовать этот материал и узнать его быстрее, чем писать ваш вопрос, но я укушу.

может ли любой или все эти шаги быть казнен с помощью TortoiseHG, как версия 0.9.2? Если да, то как?

TortiseHG еще не помещает GUI-оболочки вокруг создания субрепо, но TortiseHG всегда отлично работал с командной строкой. Используйте командную строку для создания и их, и вам хорошо идти.

что приведенный выше код do (строка за строкой объяснений было бы много. высоко ценимый.)

hg init main  # creates the main repo
cd main # enter the main repo
hg init nested # create the nested. internal repo
echo test > nested/foo # put the word test into the file foo in the nested repo
hg -R nested add nested/foo # do an add in the nested repo of file foo
echo nested = nested > .hgsub # put the string "nested = nested" into a file (in main) named .hgsub
hg add .hgsub # add the file .hgsub into the main repo

вот некоторые конкретные вопросы, которые приходили мне в голову, когда я был ... пытаясь расшифровать его: что делает>?

Это не имеет ничего общего с mercurial это стандартная оболочка (unix и dos) для "поместить результат в файл с именем X"

в строке 5, я не поймите, что такое вложенный/foo. Где пришел Ли Фу? Что фу? Ля хранилище? Папку?

это файл в subrepo. Foo-традиционное произвольное имя, а произвольное содержимое-строка "test"

строка 6 - это одна совершенно сбивает меня с толку.

это содержимое .hgsub необходимо сказать, что nested-это вложенное РЕПО с именем nested и расположенное в nested.

в строке 7, Я полагаю .hgsub добавляется в главная? Или это существо добавлено в вложенные?

main

допустим, я получаю свои подпредприятия, и мой репозиторий Bar теперь до редакция 10. Если я попытаюсь обновить до версия 7, это вызовет мою библиотеку папки (Мой Документы / Разработка / Библиотеки/ProjectA и.../ Библиотеки / ProjectB) для обновления к тому, что хранится в версии 7 как ну? Учитывая, что Foo также относится к Библиотеки/проект, это может сделать интересно!

пересмотр числа не будут переноситься, но у вас есть контроль, редактируя .файл hgsubstate.


просто быстрое обновление, после выпуска TortoiseHg 1.0.

поддержка subrepo в THG 1 достаточно хороша, чтобы вы могли делать примеры шагов из Проводника Windows. Единственный, который я не мог сделать из Explorer, был Шаг 6:

echo nested = nested > .hgsub

проводник Windows (по крайней мере, в XP) сообщает об ошибке переименования "вы должны ввести имя файла."при попытке переименовать" новый текстовый документ.txt "to".hgsub". *8')

Edit: кстати, если вы используете оба hg через TortoiseHg и командная строка, и у вас еще нет Microsofts "Command Here"PowerTool установлен, я могу очень рекомендовать его. Он добавляет запись контекстного меню "Открыть командное окно здесь" в каждый каталог в Проводнике Windows, что позволяет легко открывать командные окна в любом месте, где они вам нужны.