Splitting a Mercurial Repository
The Mercurial repository for
KnowledgeBlog [@url:knowledgeblog.org] has been starting to show the
strain for a while now. Firstly, when it was created we were all new to
mercurial; for instance it contains the
trunk directory which is
really a Subversion metaphor. The second problem is that it is a single
large repository, which maps to the development directory on my hard
drive; there is now a lot of experimental software on my hard drive
which I don't want in a public enviroment, so I am now faced with either
.hgignore or more "untracked" files than tracked. Not
At the same time, I have more recently moved mostly toward using git; actually, I still think Mercurial is nicer than git; the interface to the commands is cleaner, and the functionality is not that different. However, there is a fantastic UI, magit, for Emacs, while the equivalent for Mercurial is not as good. This is important to me. So, I wanted to try and address both of the issues at the same time; splitting the repository upon, and move to git.
The process for achieving this turned out to be relatively simply; mercurial comes with a fantastic extension called convert. This is actually a general purpose extension to convert from other VCS systems into mercurial; however, it will also convert one hg repo to another. It has the ability to both filter the existing repo and rename locations at the same time. To create my new repository I used these commands:
mkdir mathjax-latex-hg cd mathjax-latex-hg ## create filemap.txt hg init hg convert --filemap filemap.txt devel-hg-old/ .
which create a new Mercurial repository, and convert the data from the
old, tangled repository. The
filemap.txt file contains a couple of
include trunk/plugins/mathjax-latex rename trunk/plugins/mathjax-latex .
These filter for just the mathjax-latex plugin and move all its files to
top level. This is the only part of the process that needs changing to
export different parts of the repo, as I done four times now. This now
gives me a Mercurial repository in the right shape. Now, we create a new
git repo, and import the untangled Mercurial repo into git. Again,
hg-fast-export is the name of the command
on ubuntu which is more sensible than original
fast-export which is
both overly generic, and a hostage to the future.
cd .. git init mathjax-latex-git cd mathjax-latex-git hg-fast-export -r ../mathjax-latex-hg git checkout HEAD
Finally, the repo needs to be made publicly available, in this case of github. And all is complete.
git remote add origin firstname.lastname@example.org:phillord/mathjax-latex.git git push -u origin master
Of course, mathjax-latex does not actually need updating, because it is feature complete and working. However, the WordPress plugin page now includes a nasty warning, so I probably need to update it just to avoid this. Bit of a pain, especially the only way of doing this involves updating the Subversion repository, which I don't actually use. Slightly painful.