So, when I converted some repos from svn to git a few years ago I just threw away the history (I think the git-svn tool wasn’t working or I was in a hurry or something). Anyway, today I was reminded of this and thought I’d backup all my svn repos into git and where possible prepend the history to the repositories. Based on this stackoverflow post and some experimenting I did the following:
git svn clone --preserve-empty-dirs file://path/to/svn-repo/project/trunk/ INITIAL_SHA1=$(git rev-list --reverse master | head -1) # the last commit of old history branch oldhead=$(git rev-parse --verify old-history) # the initial commit of current branch newinit=$(git rev-list master | tail -n 1) # create a fake commit based on $newinit, but with a parent # (note: at this point, $oldhead must be a full commit ID) newfake=$(git cat-file commit "$newinit" \ | sed "/^tree [0-9a-f]\+\$/aparent $oldhead" \ | git hash-object -t commit -w --stdin) # replace the initial commit with the fake one git replace -f "$newinit" "$newfake" git push origin 'refs/replace/*' git filter-branch --tag-name-filter cat -- --all git replace -d $INITIAL_SHA1 git push