Подтвердить что ты не робот

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

ситуация

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

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

-- 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...

Mercurial 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?

Обновить

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


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

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

Создание субрепо

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

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

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

    ProjectA = ProjectA  
    ProjectB = ProjectB
    

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

Как только все будет настроено, вам станет легче.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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. где Неужели фью? Что такое foo? хранилище? Папка?

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

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

Поместив содержимое в .hgsub, нужно сказать, что вложенный - это вложенное репо с именем, вложенным и расположенным вложенным.

В строке 7, Я предполагаю, что hgsub добавляется к главный? Или он добавляется к вложенным?

Основной

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

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

Ответ 2

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

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

echo nested = nested > .hgsub

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

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