I’m afraid I couldn’t find anything quite like this particular scenario.
I have a git repository with a lot of history: 500+ branches, 500+ tags, going back to mid-2007. It contains ~19,500 commits. We’d like to remove all of the history before Jan 1, 2010, to make it smaller and easier to deal with (we would keep a complete copy of the history in an archive repository).
I know the commit that I want to have become the root of the new repository. I can’t, however, figure out the correct git mojo to truncate the repo to start with that commit. I’m guessing some variant of
git filter-branch
involving grafts would be necessary; it might also be necessary to treat each of the 200+ branches we want to keep separately and then patch the repo back together (something I do know how to do).
Has anyone ever done something like this? I’ve got git 1.7.2.3 if that matters.
Note: this has been deprecated in favor of
git replace.You can create a graft of the parent of your new root commit to no parent (or to an empty commit, e.g. the real root commit of your repository). E.g.
echo "<NEW-ROOT-SHA1>" > .git/info/graftsAfter creating the graft, it takes effect right away; you should be able to look at
git logand see that the unwanted old commits have gone away:If all looks as intended, you can utilize
git filter-branch -- --allto make it permanent.BEWARE: after doing the filter-branch step, all commit ids will have changed, so anybody using the old repo must never merge with anyone using the new repo.