svn switch and git svn


本文之前就想写,但是当时对svn switch不是非常了解,而且没有解决多分支开发的问题。

到今天为止,靠着强大的git把多分支开发的问题基本解决了,就上来把这一段时间内的解决过程和最终的方案说一下,希望对仍旧被svn“蹂躏”的各位有用。

首先说下多分支开发的问题。在svn下多分支开发唯一的方法是把代码checkout到不同目录中。svn switch并不能承担分支切换的功能。svn switch从它的功能来说是让一个工作副本中包含来自多个库的内容。我能想到的典型场景是“分支”合并到主干上时,当前的主干副本来需要来自其他库,即开发完成的分支的内容。其他可能是一些“异常情况”,反正不要被switch这个单词骗了……

那么svn是否有别的命令支持分支切换么?我个人没有查到。其实从我这一段时间的research,我对svn进一步的认识是:svn没有分支的概念。得出这个结论的过程可能比较长,而且有比较多的个人标准,这里就不展开了。重点是如何解决多分支版本开发问题。

在research最后几天,也就是前天,我查到一个git-svn命令,用git来管理svn。虽然是用我的手机在2G网络下查到的东西,但是一下子吸引了我,直觉告诉我我要的可能就是这个。我想很多用git的人知道,git不用分多个目录checkout多个分支,直接在工作副本中切换即可。那么用git管理svn是否也可以这么方便么?答案是确定的。不愧是强大的git。

首先是把repository clone下来,这个时间可能会比较长。

git svn clone -s URL

接下来一般来选择分支进行工作。

git branch -r
git branch -b local/branchX X

确认你当前状态

git status
git svn info
git svn dcommit --dry-run

常规开发中……
提交变更到本地

git commit -a -m "foo"

临时保存修改切换分支

git commit -a
git stash
git checkout anotherBranch
git checkout originBranch
git stash pop

提交到远程svn repository

git svn dcommit

至此,常规的svn操作都可以用git完成了,不得不说git太强大了,也进一步明白了为什么当初git的开发者为什么要开发git,而不是继续使用svn了。


One response to “svn switch and git svn”