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...
Mercurial Subrepositories
Цель - я хочу настроить подпункты так, чтобы я мог хранить исходный код для любых библиотечных проектов в моей 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
а также.../Libraries/ProjectB
) обновить до того, что хранится в 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 для простых задач, вероятно, лучше написать командные файлы для часто используемых операций подотправления (особенно для обновления).
Надеюсь, это поможет кому-то в будущем. Если вы видите какие-либо ошибки, пожалуйста, дайте мне знать (или не стесняйтесь редактировать себя, если вы можете).
2 ответа
Возможно, вы могли бы попробовать этот материал и изучить его быстрее, чем записать ваш вопрос, но я укушу.
Можно ли выполнить какой-либо или все эти шаги с помощью 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 - это традиционное произвольное имя, а произвольным содержимым является строка "test"
Строка 6 - эта полностью сбивает меня с толку.
Он помещает содержимое в.hgsub, чтобы сказать, что вложенное хранилище - это вложенное хранилище с именем nested и расположенное во вложенном хранилище.
В строке 7 я предполагаю, что.hgsub добавляется в main? Или это добавляется во вложенные?
главный
Допустим, я настроил подпункты, и мой репозиторий Bar теперь до версии 10. Если я попытаюсь обновить до версии 7, это вызовет папки моей библиотеки (Мои документы / Разработка / Библиотеки /ProjectA и.../ Библиотеки /ProjectB) обновить до того, что хранится в 7-й редакции? Учитывая, что Foo также относится к библиотекам /ProjectA, это может стать интересным!
Номера ревизий не будут переноситься, но у вас есть контроль, редактируя файл.hgsubstate.
Просто быстрое обновление, после выхода TortoiseHg 1.0.
Поддержка вложенных репозиториев в THG 1 достаточно хороша, чтобы позволить вам выполнить примеры шагов из проводника Windows. Единственный, что я не смог сделать из Explorer, это шаг 6:
echo nested = nested > .hgsub
Проводник Windows (по крайней мере, в XP) сообщает об ошибке переименования "Вы должны ввести имя файла". если вы попытаетесь переименовать "New Text Document.txt" в ".hgsub". *8')
Редактировать: Между прочим, если вы используете hg через TortoiseHg и командную строку, и у вас еще не установлен PowerTool Microsoft "Команда здесь", я настоятельно рекомендую его. Он добавляет пункт контекстного меню "Открыть командное окно здесь" в каждый каталог в проводнике Windows, что позволяет очень легко открывать командные окна в любом месте, где они вам нужны.