The Mozilla repository for Firefox development, mozilla-central, is a mercurial repository. I prefer using git for version control so I usually do my Firefox development using a git mirror of the mozilla-central repository.
To convert the repository into git I used hg-fast-export. This has worked well over the last couple of years. Unfortunately I’ve noticed that my git mirror and the official mercurial repository differ slightly. The git mirror contains files that have been deleted or moved in the official repository and lately the mirror has stopped building due to some commits not being correctly converted. As a result I stopped updating my mirror and used mercurial directly.
I still prefer developing using git though so I tried the hg-git mercurial plugin. This took about six days on my laptop to do the conversion and peaked at 14GB of memory. The result was a git repository with a working tree that, according to diff, is an exact copy of the original mercurial repositories working tree. Another nice feature of the hg-git is that commit id’s in the resulting git repository are the same across multiple runs of hg-git. This would allow other users to push and pull from a git repository that they converted independently.
To perform the conversion I installed hg-git and ran the following series of commands:
$ mkdir git $ cd git $ git init --bare $ cd .. $ hg clone https://hg.mozilla.org/mozilla-central hg $ cd hg $ hg bookmark -r default master $ hg push ../git
Six days and 14GB later, the resulting git repository ended up being about 7GB in size. I did a
git gc --aggressive on it to get this down to 200MB. Incremental updates of new mercurial commits are done with:
$ cd hg $ hg pull -u $ hg bookmark -f -r default master $ hg push ../git
I’ve pushed a mirror of this to github at http://github.com/doublec/mozilla-central. I’m using this for development and will see if it is able to continue importing without diverging from the original mozilla-central source.
More information about the use of git for Mozilla development can be found in the followup posts I did on the subject: