Wednesday, July 21, 2010

Living with Subversion and Git in parallel

This post is part of a series on Git and Subversion. To see all the related posts, screencasts and other resources, please click here

About a month ago, I made my first attempt at introducing my team to Distributed VCS with Git. We agreed that the cost of switching away from Subversion was not a hit we would want to take right now, but we continued experimenting with Git (and Mercurial) migration on the sideline. Waiting a bit longer can't hurt, as  Git continuously gets more support in both Windows and Eclipse.

In the mean time, I wanted to learn git properly, and also get a good grasp of git-svn. We will have to live with Subversion until I can convince everyone of two things

  • git can do the atleast all things svn can do better than svn
  • transition will not be too expensive (technical issues, training, people-friction)
So, I started using git as my tool for working with our Subversion repository. I quickly got into the "porcelain" of git and git-svn, and early on I noticed an unexpected bonus: Git's svn-client is actually faster than Subversion's own client (!). 

So, even though I was the only git-user in a big team using Subversion, I could still use git with many of its advantages:
And the absolute greatest thing about Git is that you get rid of those pesky .svn folders. It's amazing how much meta-shit Subversion spread around in the working directory.  In our rather large project, there were literally hundreds of thousands of files and folders that only exist for Subversion's sake. 

Searching, copying, refreshing the workspace, these operations are down to a fraction of the time they used to take.

The next bonus will be when others want a taste of the advantages it brings to use the Git client. If the project allows it, we can share progress between us in feature branches before finally committing back to Subversion. This could lead to more rapid development, allowing full collaboration on experimental development without having to bother with Subversion branches. 

Read on and get started with your own local git-svn setup:

Import the Subversion repo into Git

First, install Git. I've got version: 1.7.1, for reference.

I got some big help with this from the people in the #git channel on by the way.

Read this tutorial on how to convert the Subversion repo into a Git one

Or, you could just try it out:
git svn clone --stdlayout
Clone is basically git init plus git svn fetch. The above --stdlayout will try figuring out the historical tags and branches of your repo. It takes a while, as Git will run through the whole history of the repo, and then recreate the necessary history the Git way, compress it, remove duplicates, etc.

In case of a big Subversion repo, after some minutes of importing, Git will fail with signal 13. This is a known problem, but doing git svn fetch again picks up where it stopped. Here's a little shell script that will loop until its done:
while ! git svn fetch; do echo "git-svn halted. Restarting...i"; done

Afterwards, you'll have a Git repo with git-svn set up with the Subversion repo as a remote repository. This means that you can pull (or rather rebase) changes as they come from Subversion:
git svn rebase
or push your changes back to Subversion:
git svn dcommit
I could go on about some more advanced Subversion/Git strategies, and grafting, but this post is already long enough.

I hope that some of you Subversion users will take the time to set up git-svn for yourself. It's really worth it.