We're moving towards a world with increasingly many branches. Pulling a full clone over the network can take some time, but if you already have a local clone (say of mozilla-central), you can do a lot better.

With thanks to the Mercurial developers who pointed this trick out to me, here's how.

Pulling using an existing clone

Suppose we want to clone the cedar branch. First, make a copy of your mozilla-central clone:

~$ hg clone ~/mozilla-central cedar

Now modify the cedar tree's default path, so hg pull pulls from the cedar repo rather than from ~/mozilla-central. Open ~/cedar/.hg/hgrc with your favorite text editor and change it to:

[paths]
default=http://hg.mozilla.org/projects/cedar

Next, we need to remove the commits from your mozilla-central clone which aren't present in the upstream cedar repository:

~/cedar$ hg strip --no-backup 'roots(outgoing())'

Now we can pull from cedar and we should have an up-to-date clone:

~/cedar$ hg pull -u

In addition to being faster, this process has another advantage over cloning cedar directly: It allows hg to share storage between your mozilla-central and cedar repositories.

(Note: This process doesn't work so well with some repositories — I think it works better with branches which haven't been around for too long. For instance, the hg strip step took upwards of 20 minutes when I ran it on the tracemonkey branch.)

hg relink

If you already have two related trees and you want to share storage between them, just use the relink command. Enable it in your hgrc:

[extensions]
relink =

and then run

~/cedar$ hg relink ~/mozilla-central

This saves about 400MB per 1.1GB checkout on my machine:

~$ du -hs ~/cedar
1.1G ~/cedar

~$ du -hs ~/cedar ~/mozilla-central
1.1G ~/mozilla-central
681M ~/cedar