How do you remove big files from history in mercurial?

dvcs, mercurial, version-control

Solution

Check out the `convert` extension, particularly the `--filemap` option.

Enable by adding the following to `mercurial.ini`:

[extensions]
convert =

Create a map of files to exclude:

exclude path/to/file1
exclude path/to/file2

Then convert the repo:

hg convert srcrepo destrepo --filemap <map>

Note there is a bug in Mercurial 2.1.1 causing an error with the above command:

initializing destination destrepo repository
abort: invalid mode ('r') or filename

Just add the `--splicemap <nonexistent file>` option to fix the problem.

Problem

I have just created a mercurial repo created from a heterogeneous ecosystems of other repos. Before I publish it to my co-workers, I want to clean it as much as possible. To this end, I'd like to entirely remove a few big old files from history (pretend they never existed), so repo will be smaller. Is this possible with mercurial?

Original source