Removing files from Mercurial history
Alex Yumashev
Posted on April 20, 2019
Sometimes you need to remove files from Mercurial completely, even from the history. For instance, if you have accidentally stored a sensitive file in the repo (some password, or an access key, or a code-signing certificate etc. etc.) or committed a huge binary. Here's how you remove it:
Enter the "Convert" extension
You will need the hg convert
command. This command is normally used to convert an SVN/GIT repository to Mercurial, but it can also be used to "convert" from Mercurial to Mercurial too.
The cool thing about it is the --filemap
option that specifies which files should be included in the conversion process and which should not.
Add this code to .hgrc
to enable the extension:
[extensions]
hgext.convert=
Steps to remove a file from hg
Make sure all your teammates have pushed their local changes to the central repo (if any)
Backup your repository
Create a "map.txt" file:
# this filemap is used to exclude specific files
exclude "subdir/filename1.ext"
exclude "subdir/filename2.ext"
exclude "subdir2"
Then run this command:
hg convert --filemap map.txt c:/oldrepo c:/newrepo
NOTE: You have to use "forward-slash" in paths, even on Windows.
Then wait and be patient. After a while you will have a new repo at c:\newrepo
just without the files
(optional) Pushing your new repo back to central repo (e.g. Bitbucket)
If you have some central hg-storage you will have to "strip" all your changesets and then "push" your local repostiroy again.
For instance, if you use Bitbucket like us, go to "Admin - Strip". Enter "0" into the "Revision" box and this will remove all commits, but the "wiki" and "issues" areas will be preserved. Then - push the local repo back to Bitbucket again.
There's an important catch though - because the above procedure affects history and re-assigns new "ids" to all your changesets, your teammates have to reclone the repo from the central repo again.
Posted on April 20, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.