1、Subrepositories let you nest external repositories or projects into aparent Mercurial repository, and make commands operate on them as agroup.Mercurial currently supports Mercurial, Git, and Subversionsubrepositories.Subrepositories are made of three components:1. Nested repository checkouts. They c
2、an appear anywhere in the parent working directory.2. Nested repository references. They are defined in .hgsub, which should be placed in the root of working directory, and tell where the subrepository checkouts come from. Mercurial subrepositories are referenced like: path/to/nested = Git and Subve
3、rsion subrepos are also supported: path/to/nested = gitgit:/ path/to/nested = svn where path/to/nested is the checkout location relatively to the parent Mercurial root, and is the source repository path. The source can also reference a filesystem path. Note that .hgsub does not exist by default in M
4、ercurial repositories, you have to create and add it to the parent repository before using subrepositories.3. Nested repository states. They are defined in .hgsubstate, which is placed in the root of working directory, and capture whatever information is required to restore the subrepositories to th
5、e 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 th
6、e parentrepository. Clone or checkout the external projects where you want itto live in the parent repository. Edit .hgsub and add thesubrepository entry as described above. At this point, thesubrepository is tracked and the next commit will record its state in.hgsubstate and bind it to the committe
7、d changeset.Synchronizing a Subrepository=Subrepos do not automatically track the latest changeset of theirsources. Instead, they are updated to the changeset that correspondswith the changeset checked out in the top-level changeset. This is sodevelopers always get a consistent set of compatible cod
8、e andlibraries when they update.Thus, updating subrepos is a manual process. Simply check out targetsubrepo at the desired revision, test in the top-level repo, thencommit in the parent repository to record the new combination.Deleting a Subrepository=To remove a subrepository from the parent reposi
9、tory, delete itsreference 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. Git and Subver
10、sion subrepositories are currently silently ignored.:archive: archive does not recurse in subrepositories unless -S/-subrepos is specified.:cat: cat currently only handles exact file matches in subrepos. Git and Subversion subrepositories are currently ignored.:commit: commit creates a consistent sn
11、apshot 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 mitsubrepos=True in a configuration file (see :hg:help confi
12、g). After there are no longer any modified subrepositories, it records their state and finally commits it in the parent repository.:diff: diff does not recurse in subrepos unless -S/-subrepos is specified. Changes are displayed as usual, on the subrepositories elements. Git and Subversion subreposit
13、ories are currently silently ignored.:forget: forget currently only handles exact file matches in subrepos. Git and Subversion subrepositories are currently silently ignored.:incoming: incoming does not recurse in subrepos unless -S/-subrepos is specified. Git and Subversion subrepositories are curr
14、ently silently ignored.:outgoing: outgoing does not recurse in subrepos unless -S/-subrepos is specified. Git and 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 subrepos
15、itories 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 refer
16、enced by top-level repositories. Push is a no-op for Subversion subrepositories.: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 curre
17、ntly 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 w
18、hen using subrepositories.Remapping Subrepositories Sources=A subrepository source location may change during a project life,invalidating references stored in the parent repository history. Tofix this, rewriting rules can be defined in parent repository hgrcfile or in Mercurial configuration. See the subpaths section inhgrc(5) for more details.