Подхранилища

Подхранилища позволяют вложить несколько внешних хранилищ или проектов в родительское хранилище Mercurial и выполнять над ними команды как над единой группой.

В настоящее время поддерживаются подхранилища Mercurial, Git и Subversion.

Подхранилища включают три компонента:

  1. Извлеченные рабочие копии вложенных хранилищ. Они могут находится где угодно в рабочем каталоге.
  2. Ссылки на вложенные хранилища. Они определяются в файле ".hgsub", который должен находиться в корне рабочего каталога, и описывают, откуда были извлечены копии подхранилищ. Подхранилища Mercirial имеют такие пути:
    path/to/nested = https://example.com/nested/repo/path
    

    Поддерживаются также подхранилища Git и Subversion:

    path/to/nested = [git]git://example.com/nested/repo/path
    path/to/nested = [svn]https://example.com/nested/trunk/path
    

    где "path/to/nested" - путь к извлеченной рабочей копии относительно корня родительского хранилища Mercurial, а "https://example.com/nested/repo/path" - путь к хранилищу- источнику. Источник может быть также путем в файловой системе.

    Обратите внимание, что ".hgsub" по умолчанию не существует в хранилищах Mercurial, вам надо создать его и добавить в родительское хранилище перед использованием подхранилищ.

  3. Состояния вложенных хранилищ. Они определяются в файле ".hgsubstate", который должен находиться в корне рабочего каталога, и содержат информацию, необходимую для дальнейшего восстановления подхранилищ до состояния, в котором они были зафиксированы в родительское хранилище. Mercurial записывает состояния вложенных хранилищ автоматически при фиксации родительского хранилища.

    Примечание:

    Файл ".hgsubstate" не следует редактировать вручную.

Добавление подхранилища

Если файл ".hgsub" не существует, создайте его и добавьте в родительское хранилище. Клонируйте или извлеките внешние проекты в каталог, в котором они будут размещаться в родительском хранилище. Отредактируйте файл ".hgsub", добавив туда запись для подхранилища как описано выше. Начиная с этого момента, это подхранилище контролируется Mercurial, и при следующей фиксации в файле ".hgsubstate" будет зафиксировано его состояние и выполнена привязка к нему зафиксированного набора изменений.

Синхронизация подхранилища

Подхранилища не отслеживают автоматически изменения в их источниках. Вместо этого они обновляются до ревизии, соответствующей ревизии, извлеченной уровнем выше. Это сделано для того, чтобы разработчики всегда имели целостный набор кода и библиотек, когда они обновляются.

Таким образом, обновление подхранилища необходимо выполнять вручную. Просто извлеките желаемую ревизию подхранилища, протестируйте ее в родительском хранилище и выполните commit в родительском хранилище, чтобы зафиксировать новую комбинацию.

Удаление подхранилища

Чтобы удалить подхранилище из родительского хранилища, удалите ссылку на него из файла ".hgsub", после чего удалите его файлы.

Взаимодействие с командами Mercurial

add
не обрабатывает подхранилища рекурсивно, если не указан ключ -S/--subrepos. Однако, если вы укажете полный путь к файлу из подхранилища, он будет добавлен даже без -S/--subrepos. Подхранилища Git и Subversion в настоящий момент молча игнорируются.
archive
archive не обрабатывает подхранилища рекурсивно, если не указана опция -S/--subrepos.
cat
cat в настоящее время обрабатывает только полные совпадения файлов в подхранилищах. Хранилища Git и Subversion игнорируются.
commit
commit создает целостный снимок состояния всего проекта и его подхранилищ. Если хотя бы одно подхранилище было изменено, выполнение прерывается. Можно заставить Mercurial вместо этого фиксировать все измененные подхранилища с помощью -S/--subrepos или настройкой "ui.commitsubrepos=True" в конфиге (см. "hg help config"). После того, как измененных подхранилищ не осталось, их состояние записывается и фиксируется в основном хранилище.
diff
diff не обрабатывает подхранилища рекурсивно, если не указана опция -S/--subrepos. Различия отображаются как обычно для элементов подхранилищ. Хранилища Subversion в настоящее время молча игнорируются.
forget
forget в настоящее время обрабатывает только точные совпадения имен файлов в подхранилищах. Хранилища Subversion в настоящее время молча игнорируются.
incoming
incoming не обрабатывает подхранилища рекурсивно, если не указан параметр -S/--subrepos. Подхранилища Subversion в настоящее время молча игнорируются.
outgoing
outgoing не обрабатывает подхранилища рекурсивно, если не указан параметр -S/--subrepos. Подхранилища Subversion в настоящее время молча игнорируются.
pull
pull не обрабатывает подхранилища рекурсивно, т.к. до выполнения "hg update" не ясно, что затягивать. Перечисление и передача изменений во всех подхранилищах, на которые ссылаются затянутые ревизии родительского хранилища в лучшем случае дорого, либо вообще невозможно в случае с Subversion.
push
Mercurial автоматически выполняет push сначала для всех подхранилищ при выполнении push для родительского хранилища. Это позволяет быть уверенным, что новые изменения в подхранилищах будут доступны, когда на них ссылаются хранилища уровнем выше. Push не делает ничего для подхранилищ Subversion.
status
status по умолчанию не обрабатывает подхранилища рекурсивно, если не указан -S/--subrepos. Изменения в подхранилищах отображаются как обычные изменения в элементах подхранилища. Хранилища Subversion в настоящее время молча игнорируются.
update
update восстанавливает подхранилища до состояния, в котором они были зафиксированы в целевой ревизии. Если записанная ревизия недоступна, Mercurial сначала затянет ее до обновления. Это значит, что обновление может потребовать доступа к сети при использовании подхранилищ.

Переназначение источников подхранилищ

Местоположение источников подхранилищ может меняться в течение жизни проекта, делая ссылки, хранящиеся в истории родительского хранилища, некорректными. Чтобы исправить это, можно определить правила переназначения в файле "hgrc" родительского хранилища или в конфиге Mercurial. Подробнее см. секцию "[subpaths]".