mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
296a0c6305
Change the behavior of the add command such that explicit paths in subrepos are always added. This eliminates the previous behavior where if you called "hg add" for an explicit path in a subrepo without specifying the -S option, it would be silently ignored. If you specify patterns, or no arguments at all, the -S option will still be needed to activate recursion into subrepos.
137 lines
5.4 KiB
Plaintext
137 lines
5.4 KiB
Plaintext
Subrepositories let you nest external repositories or projects into a
|
|
parent Mercurial repository, and make commands operate on them as a
|
|
group.
|
|
|
|
Mercurial currently supports Mercurial, Git, and Subversion
|
|
subrepositories.
|
|
|
|
Subrepositories are made of three components:
|
|
|
|
1. Nested repository checkouts. They can appear anywhere in the
|
|
parent working directory.
|
|
|
|
2. Nested repository references. They are defined in ``.hgsub`` and
|
|
tell where the subrepository checkouts come from. Mercurial
|
|
subrepositories are referenced like:
|
|
|
|
path/to/nested = https://example.com/nested/repo/path
|
|
|
|
Git and Subversion subrepos are also supported:
|
|
|
|
path/to/nested = [git]git://example.com/nested/repo/path
|
|
path/to/nested = [svn]https://example.com/nested/trunk/path
|
|
|
|
where ``path/to/nested`` is the checkout location relatively to the
|
|
parent Mercurial root, and ``https://example.com/nested/repo/path``
|
|
is the source repository path. The source can also reference a
|
|
filesystem path.
|
|
|
|
Note that ``.hgsub`` does not exist by default in Mercurial
|
|
repositories, you have to create and add it to the parent
|
|
repository before using subrepositories.
|
|
|
|
3. Nested repository states. They are defined in ``.hgsubstate`` and
|
|
capture whatever information is required to restore the
|
|
subrepositories to the state they were committed in a parent
|
|
repository changeset. Mercurial automatically record the nested
|
|
repositories states when committing in the parent repository.
|
|
|
|
.. note::
|
|
The ``.hgsubstate`` file should not be edited manually.
|
|
|
|
|
|
Adding a Subrepository
|
|
----------------------
|
|
|
|
If ``.hgsub`` does not exist, create it and add it to the parent
|
|
repository. Clone or checkout the external projects where you want it
|
|
to live in the parent repository. Edit ``.hgsub`` and add the
|
|
subrepository entry as described above. At this point, the
|
|
subrepository is tracked and the next commit will record its state in
|
|
``.hgsubstate`` and bind it to the committed changeset.
|
|
|
|
Synchronizing a Subrepository
|
|
-----------------------------
|
|
|
|
Subrepos do not automatically track the latest changeset of their
|
|
sources. Instead, they are updated to the changeset that corresponds
|
|
with the changeset checked out in the top-level changeset. This is so
|
|
developers always get a consistent set of compatible code and
|
|
libraries when they update.
|
|
|
|
Thus, updating subrepos is a manual process. Simply check out target
|
|
subrepo at the desired revision, test in the top-level repo, then
|
|
commit in the parent repository to record the new combination.
|
|
|
|
Deleting a Subrepository
|
|
------------------------
|
|
|
|
To remove a subrepository from the parent repository, delete its
|
|
reference from ``.hgsub``, then remove its files.
|
|
|
|
Interaction with Mercurial Commands
|
|
-----------------------------------
|
|
|
|
: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.
|
|
|
|
:archive: archive does not recurse in subrepositories unless
|
|
-S/--subrepos is specified.
|
|
|
|
:commit: commit creates a consistent snapshot of the state of the
|
|
entire project and its subrepositories. It does this by first
|
|
attempting to commit all modified subrepositories, then recording
|
|
their state and finally committing it in the parent
|
|
repository. Mercurial can be made to abort if any subrepository
|
|
content is modified by setting "ui.commitsubrepos=no" in a
|
|
configuration file (see :hg:`help config`).
|
|
|
|
:diff: diff does not recurse in subrepos unless -S/--subrepos is
|
|
specified. Changes are displayed as usual, on the subrepositories
|
|
elements. Subversion subrepositories are currently silently
|
|
ignored.
|
|
|
|
:incoming: incoming does not recurse in subrepos unless -S/--subrepos
|
|
is specified. Subversion subrepositories are currently silently
|
|
ignored.
|
|
|
|
:outgoing: outgoing does not recurse in subrepos unless -S/--subrepos
|
|
is specified. Subversion subrepositories are currently silently
|
|
ignored.
|
|
|
|
:pull: pull is not recursive since it is not clear what to pull prior
|
|
to running :hg:`update`. Listing and retrieving all
|
|
subrepositories changes referenced by the parent repository pulled
|
|
changesets is expensive at best, impossible in the Subversion
|
|
case.
|
|
|
|
:push: Mercurial will automatically push all subrepositories first
|
|
when the parent repository is being pushed. This ensures new
|
|
subrepository changes are available when referenced by top-level
|
|
repositories.
|
|
|
|
:status: status does not recurse into subrepositories unless
|
|
-S/--subrepos is specified. Subrepository changes are displayed as
|
|
regular Mercurial changes on the subrepository
|
|
elements. Subversion subrepositories are currently silently
|
|
ignored.
|
|
|
|
:update: update restores the subrepos in the state they were
|
|
originally committed in target changeset. If the recorded
|
|
changeset is not available in the current subrepository, Mercurial
|
|
will pull it in first before updating. This means that updating
|
|
can require network access when using subrepositories.
|
|
|
|
Remapping Subrepositories Sources
|
|
---------------------------------
|
|
|
|
A subrepository source location may change during a project life,
|
|
invalidating references stored in the parent repository history. To
|
|
fix this, rewriting rules can be defined in parent repository ``hgrc``
|
|
file or in Mercurial configuration. See the ``[subpaths]`` section in
|
|
hgrc(5) for more details.
|
|
|