This repository has been archived by the owner. It is now read-only.
history preserving svn to git migration using git-svn
Shell Perl
Switch branches/tags
Nothing to show
Pull request Compare This branch is 6 commits ahead, 2 commits behind nothingmuch:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



Place these scripts anywhere in $PATH (e.g. create symlinks in /usr/local/bin) and make sure they are executable, just like any other script. The git command will know how to find them.


See my detailed blog post for a how-to.

In brief:

  1. Install (above), then git svn clone your repo, preferably using Sam Vilain's [svn-merge-attrs branch] (, using --prefix svn. This assumes standard layout.

  2. Inside the repo run git svn-abandon-fix-refs

  3. Create .git/info/grafts file for merge commits (might not be necessary with the svn-merge-attrs branch). This is just if you have any svn merges that occurred between branches.

  4. If you want to retain the map of svn-rev to git-commit, run git-svn-abandon-make-svn-refs.

  5. Run git-svn-abandon-cleanup

The resulting repository should have only refs/heads/* and tags. All svn tags are recreated as annotated tags.

git-svn-id: and svk message pollution is cleaned up.

When you have a merge commit that is not recognized as such, the grafts file can be used to add additional parents, preserving history information.

If you chose to retain the svn revision mapping, you can reference svn revisions as follows: git show svn/r1234, git log svn/r1234, etc. Otherwise, these revisions are invisible to git branch -a, git tag -l, and git for-each-ref. These refs do not travel with git push / git pull, so be prepared to transfer them out-of-band


You may get this error message:

% git svn-abandon-fix-refs
git: 'svn-abandon-fix-refs' is not a git-command. See 'git --help'.

This means you haven't placed those scripts in your PATH.


If this script is too slow for a large repository, or doesn't handle something complicated look into Snerp Vortex:

For a simpler approach, several svn2git scripts exist, in both Ruby and Perl.


These commands are more for abandoning SVN in favour of git and getting as clean a history as possible. Maintenance is just like a normal git repository.

After git svn-abandon-cleanup has been run, git svn rebase can't be run anymore, so you can't bring it up to date without keeping the old SVN repo around and grafting things to the conversion.

If you maintained the svn revision map, then after running git svn-abandon-cleanup, any history rewriting will orphan the svn refs