Splitting a Mercurial Repository
- Earlier: Is Peer Review the Future?
- Later: Why Metadata Must be Useful
2013-03-03
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
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.
- Earlier: Is Peer Review the Future?
- Later: Why Metadata Must be Useful