We're slowly moving internal svn projects over to github. I wrote up some notes to help colleagues moving projects themselves. Which can be helpful for others, so I've cleaned my notes up a bit and I'm posting them here.
Initial one-time setup
First things first: create a ~/.svn2git/authors file. svn2git uses that to couple svn users with emails known to github. (Update 2011-10-13: I used to say "usernames on github" instead of "emails known to github", Adam Reeve corrected me in the comments below. He's right that the username doesn't matter, you can use a real name.)
Here's a sample from mine:
# svn_username = Real Name <email@you.use.in.github> Reinout = Reinout van Rees <reinout@vanrees.org> Gijs = Gijs Nijholt <gijs.nijholt@gmail.com> reinout.vanrees = Reinout van Rees <reinout@vanrees.org> ...
If there are usernames missing, svn2git will warn you about it, btw.
Next, install svn2git. See https://github.com/nirvdrum/svn2git#readme . I've copied the instructions for debian/ubuntu here:
$> sudo apt-get install git-core git-svn ruby rubygems $> sudo gem install svn2git --source http://gemcutter.org
Converting something to github
Create a temporary directory and chdir to it:
$> mkdir /tmp/something $> cd /tmp/something
Call svn2git on the main directory, not on trunk:
$> svn2git https://office.nelen-schuurmans.nl/svn/Products/Library/timeseries Using higher level of URL: ... W: Ignoring error from SVN, path probably does not exist: ... W: Do not be alarmed at the above message git-svn is just ... This may take a while on large repositories W: +empty_dir: Products/Library/timeseries/trunk/doc/source/_static W: +empty_dir: Products/Library/timeseries/trunk/timeseries.egg-info ... Lots of warnings and fatal errors, btw. ... HEAD is now at a6be9f3... Tagging 0.7 Previous HEAD position was a6be9f3... Tagging 0.7 Switched to branch 'master' Counting objects: 367, done. Delta compression using up to 4 threads. Compressing objects: 100% (359/359), done. Writing objects: 100% (367/367), done. Total 367 (delta 220), reused 0 (delta 0)
Your temporary directory is now a full local git repository. Now we have to make the github repository ("the remote") and push our repository to it.
Create a repository on github and follow the instructions for importing an existing repository:
$> git remote add origin git@github.com:nens/timeseries.git $> git push -u origin master
And also push the tags:
$> git push --tags
Then, run git branch to see if there are branches that you want to push over to git as they're NOT pushed by default:
$> git branch * master reinout-experimental $> git push origin reinout-experimental
Corner case: moved svn directories
Several of our projects are old enough to have been moved inside our svn repository. Such a move is not something that svn2git likes. In such a case, find the revision number of the move in svn and run svn2git as follows:
$ svn2git https://office.nel...nl/timeseries --revision 11070
This starts the conversion at that revision number. You do lose the specific changesets from before that time, though.
