Положение
У меня есть два решения .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 ...
Ртутные субпозитории
Цель - Я хочу настроить подпункты, чтобы в исходных кодах Foo
и Bar
я мог сохранять исходный код для любых библиотечных проектов, на которые есть ссылки.
Согласно этой странице (что в буквальном смысле является единственной документацией, которую я могу найти по подпунктам), для настройки подпрепарата необходимо выполнить следующие команды из окна консоли 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 >
, но ничего не нашел.
- В строке 5 я не понимаю, что такое
nested/foo
. Откуда взялся foo
? Что такое foo
? Хранилище? Папка?
- Строка 6 - это полностью сбивает меня с толку.
- В строке 7 я предполагаю, что
.hgsub
добавляется к main
? Или это добавляется к nested
?
- Допустим, я настроил подпункты, и мой репозиторий
Bar
обновлен до версии 10. Если я попытаюсь обновить свой рабочий каталог до версии 7, это вызовет мои папки библиотеки (My Documents/Development/Libraries/ProjectA
и * 1064). *) обновить до того, что хранится в 7-й редакции?
Обновление
Я добавил 8-ю строку кода: ci -m "initial commit"
. Это делает две вещи: (1) добавляет файл .hgsubstate к основному репозиторию и (2) фиксирует все изменения, включая новый подпункт, в главном репозитории (с сообщением «начальная фиксация»). Файл .hgsubstate предназначен для отслеживания состояния всех вложенных элементов, поэтому, если вы вернетесь к более ранней версии, он также получит правильную версию из всех вложенных элементов.
Обновление 2 - некоторые инструкции
После дальнейших экспериментов я думаю Теперь я могу предоставить шаги для решения моей первоначальной проблемы (в основном используя Windows Explorer и TortoiseHG):
Создание подэпо
Libraries/ProjectA
, Libraries/ProjectB
, а основные репозитории (Projects/Foo/Solution
и Projects/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
.
Как бы мне не нравился TortoiseHG для простых задач, вероятно, лучше написать командные файлы для часто используемых операций подотупления (особенно обновления).
Надеюсь, это поможет кому-то в будущем. Если вы видите какие-либо ошибки, пожалуйста, дайте мне знать (или не стесняйтесь редактировать себя, если можете).