Подхранилища
Подхранилища позволяют вложить несколько внешних хранилищ или проектов
в родительское хранилище Mercurial и выполнять над ними команды как над
единой группой.
В настоящее время поддерживаются подхранилища Mercurial, Git
и Subversion.
Подхранилища включают три компонента:
- Извлеченные рабочие копии вложенных хранилищ. Они могут находится где угодно в рабочем каталоге.
- Ссылки на вложенные хранилища. Они определяются в файле ".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, вам надо создать его и добавить
в родительское хранилище перед использованием подхранилищ.
- Состояния вложенных хранилищ. Они определяются в файле ".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]".