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

Подхранилища позволяют вложить несколько внешних хранилищ или проектов в родительское хранилище 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
add does not recurse in subrepos unless -S/--subrepos is specified. However, if you specify the full path of a file in a subrepo, it will be added even without -S/--subrepos specified. Subversion subrepositories are currently silently ignored.
addremove
addremove does not recurse into subrepos unless -S/--subrepos is specified. However, if you specify the full path of a directory in a subrepo, addremove will be performed on it even without -S/--subrepos being specified. Git and Subversion subrepositories will print a warning and continue.
archive
archive не обрабатывает подхранилища рекурсивно, если не указана опция -S/--subrepos.
cat
Git subrepositories only support exact file matches. Subversion subrepositories are currently ignored.
commit
commit creates a consistent snapshot of the state of the entire project and its subrepositories. If any subrepositories have been modified, Mercurial will abort. Mercurial can be made to instead commit all modified subrepositories by specifying -S/--subrepos, or setting "ui.commitsubrepos=True" in a configuration file (see 'hg help config'). After there are no longer any modified subrepositories, it records their state and finally commits it in the parent repository. The --addremove option also honors the -S/--subrepos option. However, Git and Subversion subrepositories will print a warning and abort.
diff
diff does not recurse in subrepos unless -S/--subrepos is specified. However, if you specify the full path of a file or directory in a subrepo, it will be diffed even without -S/--subrepos being specified. Subversion subrepositories are currently silently ignored.
files
files does not recurse into subrepos unless -S/--subrepos is specified. However, if you specify the full path of a file or directory in a subrepo, it will be displayed even without -S/--subrepos being specified. Git and Subversion subrepositories are currently silently ignored.
forget
forget в настоящее время обрабатывает только точные совпадения имен файлов в подхранилищах. Хранилища Subversion в настоящее время молча игнорируются.
incoming
incoming не обрабатывает подхранилища рекурсивно, если не указан параметр -S/--subrepos. Подхранилища Subversion в настоящее время молча игнорируются.
outgoing
outgoing не обрабатывает подхранилища рекурсивно, если не указан параметр -S/--subrepos. Подхранилища Subversion в настоящее время молча игнорируются.
pull
pull не обрабатывает подхранилища рекурсивно, т.к. до выполнения 'hg update' не ясно, что затягивать. Перечисление и передача изменений во всех подхранилищах, на которые ссылаются затянутые ревизии родительского хранилища в лучшем случае дорого, либо вообще невозможно в случае с Subversion.
push
Mercurial автоматически выполняет push сначала для всех подхранилищ при выполнении push для родительского хранилища. Это позволяет быть уверенным, что новые изменения в подхранилищах будут доступны, когда на них ссылаются хранилища уровнем выше. Push не делает ничего для подхранилищ Subversion.
serve
serve does not recurse into subrepositories unless -S/--subrepos is specified. Git and Subversion subrepositories are currently silently ignored.
status
status по умолчанию не обрабатывает подхранилища рекурсивно, если не указан -S/--subrepos. Изменения в подхранилищах отображаются как обычные изменения в элементах подхранилища. Хранилища Subversion в настоящее время молча игнорируются.
remove
remove does not recurse into subrepositories unless -S/--subrepos is specified. However, if you specify a file or directory path in a subrepo, it will be removed even without -S/--subrepos. Git and Subversion subrepositories are currently silently ignored.
update
update восстанавливает подхранилища до состояния, в котором они были зафиксированы в целевой ревизии. Если записанная ревизия недоступна, Mercurial сначала затянет ее до обновления. Это значит, что обновление может потребовать доступа к сети при использовании подхранилищ.

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

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