I’ve migrated a couple of my SVN repositories to Git, but each time I forget how to do this. And each time I had to look into Pro Git book and process all the extra info there. So, I decided to document the steps I did for future reference. This is in no way a tutorial or something that has a good explanation of what’s going on. If you want to get a deeper information on the subject go read the book mentioned above.
I don’t work in a mixed SVN/Git environment so I only need to do this once for each project and forget about SVN on that project, so I figured I will document the steps and follow them blindly when I need to repeat the procedure for the next project. Note that this only migrates the trunk (or branch specified by the url) and doesn’t migrate tags, etc. If you need more than just a change log of your main branch, read the book/documentation.
So here we go.
- Create a directory for the new Git repository
- In that directory create a file called users.txt which looks like this:
username = Real Name <email@example.com>
It’s used to match usernames in SVN commits to Git’s user information
- Run Git Bash in that directory and enter this command:
git svn clone <svn-repository-url> --authors-file=users.txt --no-metadata
Where <svn-repository-url> is the url of your SVN repository. If you use TortoiseSVN you can easily find this url by right clicking on your working copy and navigating to “TortoiseSVN->Relocate…” in the context menu.
--authors-file tells Git to use your users file and --no-metadata tells it to omit metadata used by Git to synchronize repository with SVN. When you are migrating it’s quite important to use no-metadata as by default git-svn adds extra information to commit messages and you don’t want it.
And that’s basically it. However I do a couple extra steps to remove traces of SVN in my new Git repository.
Removing traces of SVN
Now I’m sure I don’t do this properly, but I couldn’t figure out how to do this the right way. So if you know how to do this from command line or some tool, please, let me know in the comments bellow.
- Remove sections [svn-remote …] and [svn] in file .git/config
- Delete file .git/refs/remotes/git-svn
- Remove directory .git/svn
As I said it’s not a good idea to mess with files in .git directory directly but I was unable to find commands to do this properly. So proceed on your own risk. It’s worth mentioning that this isn’t necessary, but for some reason these unneeded traces of SVN annoy me.