I’ve used two methods of closing branches in Mercurial.
The first non-destructively closes the branch just so it doesn’t show up in
hg heads. You switch to the bad branch (use either the tag or revision number) then add a commit that closes the branch:
hg up -C badbranch hg com --close-branch -m "closing this branch" hg up default
The second destructively closes the branch, which can dramatically reduce the size of the repository’s
.hg folder. I did this when I was moving my work repository to BitBucket. It isn’t an easy process and is very time consuming, and make sure you have backups.
Say you’re in
C:\projects and the repository you want to clone is in
C:\projects\my_repo. You clone the entire repository, but only the heads that you want to keep:
hg clone my_repo my_repo.clone --rev <revision> --rev <another revision> ...
For example, I only wanted to save my
stable branches, so I used
hg clone my_repo my_repo.clone --rev default --rev stable.
Then verify that the differences between the original and the cloned repository are only the branches you wanted to drop:
hg incoming -R my_repo.clone my_repo
If you missed some changesets in the clone step you can pull them over:
hg pull -R my_repo.clone my_repo --rev <missed revision>
You then need to copy over non-tracked files from the original repository, especially
.hg\hgrc, as the cloned repository is pointing to the original repository by default.
I had issues getting the trimmed repository over to other copies of the repository. In particular I couldn’t
hg pull from the trimmed repository any more. I ended up just copying the entire repository to my different machines and set them up from there.
The Mercurial Wiki has a fine page on pruning branches which is where I found these methods.