First Try of Git-Svn on CafeMol

git-svn - Bidirectional operation between a Subversion repository and Git.1


Luckily, when I began to consider version control for my poor codes, there had already been Git and Github. Nearly three years ago, I used Git to organize my thesis. That was really nice memory during the last days of my “miserable” PhD life (:P).

However, I had to learn and use SVN since the beginning of my postdoc career. I struggled to use git on my own copy of code that was pulled from the SVN server. I added .svn to .gitignore, carefully picked out the modifications from git diff, manually applied them to the SVN repository and then svn commit.

Git provided git svn to control changes between Git and Subversion.

## Description ---

Here I used CafeMol as an example to show the basic usage of git svn.

### Pull a copy from SVN server

This is the very first step.

git svn clone cafemol --username tan

Many online tutorials suggest using the option -s to automatically pull down all the svn branches. In my case I don’t think it’s a good idea. For CafeMol there are (too) many developers who have their own svn branches, which are usually just “Medium-Rare”. Besides, git svn clone -s will even create git branches for the deleted svn branches. Therefore if you want a clean list every time you run git branch -a, forget the -s option.

### Get a list of `gitignore` from svn repository

Simply run:

git svn show-ignore >> .git/info/exclude

### Basic usage

Update to the latest version

git svn rebase

Push local changes to svn server

git svn dcommit

Read logs

git svn log | less

# or:
git log

Create local branches and normal commits

These are exactly same as normal git commands:

git checkout -b develop
git add .
git commit -a

Prepare to merge changes to master:

git rebase master
git checkout master
git merge develop

The main reason to use rebase instead of merge is to keep simple commit history for svn log.

### Caveats

It’s always a good habit to make local changes on developing branches first, and then merge them to master and then push to remotes. However, git svn dcommit rewrites the commit information and assign a new “git-svn-id” to commit every time. This results in a strange topology of branch tree: same parents will have different names. Thus it’s recommended that after every “dcommit”, one should clean local branches to avoid possible weird behaviors.


comments powered by Disqus