Mercurial Subrepos - Как вы их создаете и как они работают? - PullRequest
36 голосов
/ 18 января 2010

Положение

У меня есть два решения .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"

Вопросы

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

Обновление

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


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

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

Создание подэпо

  1. Libraries/ProjectA, Libraries/ProjectB, а основные репозитории (Projects/Foo/Solution и 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.

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

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

Ответы [ 2 ]

20 голосов
/ 18 января 2010

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

Может ли любой или все эти шаги быть выполнено с 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

Вот некоторые конкретные вопросы, которые пришли в голову, как я был пытаясь расшифровать это: Что делает> 1015 *

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

В строке 5 я не понять, что такое вложенное / foo. куда откуда появился foo? Что такое Фу? хранилище? Папка?

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

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

Он помещает содержимое в .hgsub, необходимое для того, чтобы сказать, что вложенное - это вложенное хранилище с именем nested и расположенное во вложенном.

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

основной

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

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

6 голосов
/ 29 марта 2010

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

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

echo nested = nested > .hgsub

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

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

...