Saturday, August 1, 2009

On Version Control

While I'm sure that the paid services of github are great, I'm not convinced that I should be paying for private hosting of my repositories. So I needed to come up with a free solution that fit my development needs. I am a sole programmer for small Rails projects, but I needed a way to get my code from work to home (and vice versa) with limited trouble. Version control is the obvious solution, but there was some problems because my work machines are behind a VPN that I can't always connect to since it's a Windows only client, and I don't always want to start up Virtualbox to just checkout/checkin.

My first experience with version control was using subversion. I set up my own server at work, but the problem there was that I could only check in and out while at work (or on VPN), and I sometimes like to work on projects at home. I then started using Beanstalk, which has a really nice UI and design, but only gives one repository for free and doesn't give SSL access. I then moved to Assembla, which didn't give SSL access, but gave unlimited repos for free. They then decided to start charging, so I looked around again and found xp-dev. XP-Dev was great, unlimited repos, SSL access, and a sufficiently large disk quota. The problem is that they decided that in August they would move SSL access to a paid only service, so it was time to reassess my options.. It was also at this time I decided to move to git instead of svn.

My requirements for git hosting were:
  • Unlimited private repositories (or at least, many)
  • A large enough quota (> 100M) where I won't realistically have to worry about space
  • SSL (or otherwise secure) updates
  • Ability to access on and off my work VPN
  • Works across platform (primary OSX and Linux)
  • A copy of the repo on my work version control server.
What I came up with actually works quite well. I've been a happy user of Dropbox for a while now, so I created a 'git' directory there and initialized some bare repositories. From my local git repos, I push (as a local file) to the Dropbox directory as the origin. That repository then gets automatically updated on each server that has Dropbox installed on it and linked to my account (my work Linux machine and my home OSX machine.) When I am at work, I just pull whatever commits I had made. I also added another remote of my work's version control system and push changes (over ssh) to that as well.

Given git's distributed nature and Dropbox's ability to synchronize changes to multiple places (over SSL no less) all of my requirements are met for version control.