git filter-branch
doesn't itself support a suspend/resume pattern of use - although it writes temporary data out to a .git-rewrite
folder, there's no actual support for resuming based on the contents of this directory. If you run git filter-branch
on a repository that's had a previously aborted filter-branch
operation, it'll either ask you to delete that temp folder, or, with the --force
option, do it itself.
The underlying problem is that git-filter-branch
is slow running on big repos - if the process was much faster, there'd be no motivation to attempt a resume. So you've got a few options:
Make git-filter-branch go a bit faster...
- use a RAM-disk -
git-filter-branch
is very IO-intensive, and will run faster with your repository sitting in RAM. - use
--index-filter
rather than--tree-filter
- it's similar to tree filter but doesn't check out the file-tree, which makes it faster, but does require you to rewrite your file alterations in terms of git index commands. - use cloud computing and hire a machine with fast ram and high clock-speed (don't bother with multiple cores unless your own commands are multi-threaded, as
git-filter-branch
itself is single-threaded)
...or use The BFG (way faster)
The BFG Repo-Cleaner is a simpler, faster alternative to git-filter-branch
- on large repos it's 50-150x faster. That turns your job that takes several hours into one that takes just a few minutes.
Full disclosure: I'm the author of the BFG Repo-Cleaner.