Подхранилища
""""""""""""
Подхранилища позволяют вложить несколько внешних хранилищ или проектов
в родительское хранилище 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 записывает состояния вложенных
хранилищ автоматически при фиксации родительского хранилища.
.. note::
Файл ``.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]``.