ситуация
У меня есть два.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"
Вопросов
- Может ли любой или все эти шаги выполняться с TortoiseHG, начиная с версии 0.9.2? Если да, то как? Я уверен, что строки 1-3 могут, но я не знаю о строках 4-7. Ничего из этого, похоже, не зарегистрировано в TortoiseHG.
- Что делает вышеупомянутый код (поэтапное объяснение было бы очень оценено). Вот некоторые конкретные вопросы, которые приходили на ум, когда я пытался его расшифровать:
- Что
>
делать? Я пробовал искать в Mercurial docs для>
, но ничего не нашел. - В строке 5 я не понимаю, что такое
nested/foo
. Откуда появилсяfoo
? Что такоеfoo
? Репозиторий? Папка? - Строка 6 - эта меня полностью сбивает с толку.
- В строке 7 я предполагаю, что
.hgsub
добавляется вmain
? Или это добавляется кnested
?
- Что
- Скажем, я установил свой подпорос, и мой репозиторий
Bar
теперь до версии 10. Если я попытаюсь обновить рабочий каталог до версии 7, это вызовет мои папки библиотек (My Documents/Development/Libraries/ProjectA
и.../Libraries/ProjectB
) для обновления до того, что хранится в редакции 7?
Обновить
Я добавил восьмую строку кода: ci -m "initial commit"
. Это делает две вещи: (1) добавляет файл.hgsubstate в основное репо и (2) совершает все изменения, в том числе новый подрепо, в основной репозиторий (с сообщением "начальное коммит"). Цель файла.hgsubstate - отслеживать состояние всех подпоследовательностей, поэтому, если вы вернетесь к более ранней версии, она также проведет правильную ревизию со всех подпозиций.
Обновление 2 - некоторые инструкции
После дальнейших экспериментов, я думаю, теперь я могу предложить шаги для решения моей первоначальной проблемы (используя в основном Windows Explorer и TortoiseHG):
Создание субрепо
-
Libraries/ProjectA
,Libraries/ProjectB
и основные репозитории (Projects/Foo/Solution
andProjects/Bar/Solution
) должны быть отдельными репозиториями. - Открытые
Projects/Foo/Solution
. - Клон из
Libraries/ProjectA
вProjects/Foo/Solution
. - Добавьте
ProjectA
в репозиторийFoo
. -
Используйте текстовый редактор для создания файла с именем
.hgsub
, содержащего следующее:ProjectA = ProjectA
-
Откройте окно консоли DOS и введите следующие команды (см. Примечание ниже):
cd c:\...\Projects\Foo\Solution hg ci -m "Committing subrepo "ProjectA"
-
Для
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 для простых задач, вероятно, лучше писать командные файлы для часто используемых операций подрепо (особенно для обновления).
Надеюсь, это поможет кому-то в будущем. Если вы видите какие-либо ошибки, сообщите мне (или не стесняйтесь редактировать себя, если сможете).