Splitting a Mercurial Repository
The Mercurial repository for
KnowledgeBlog (n.d.) 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 an enormous .hgignore
or
more “untracked” files than tracked. Not ideal.
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
lines only:
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,
reasonably straight-forward. 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 git@github.com: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.