git svn主要使用流程:
从svn仓库初始化成本地git仓库:
[cce lang="bash"]
git svn clone -s SVN_URL
[/cce]
注意:SVN_URL是svn仓库的基础目录,不包含trunk,branches这些目录。这里加上一个-s是--stdlayout的缩写,标识svn地址是符合标准svn目录结构的,既有SVN_URL/trunk,SVN_URL/branches,SVN_URL/tags这些目录(当然后面两个目录是非必须的,如果没有,后续拉分支的时候可能会失败)
执行后,整个svn分支上的版本都会重放一边,git生成自己的commit记录,如果分支提交记录比较多,速度会比较慢的,
切换svn分支:
[cce lang="bash"]
git checkout -b local/local_branch remotes/remote_branch
[/cce]
当然,切换分支之前,可以通过git branch -a或者git branch -r查看svn上的分支,这里显示的分支名称,是SVN_URL/branches目录中的名字。上述切换分支的命令,会在本地创建一个git分支,然后将这个git分支的remote refs设置成远程的svn分支。
提交本地修改:
[cce lang="bash"]
git commit
git svn dcommit
[/cce]
首先本地是一个git仓库,所以所有的修改,必须先提交到本地的git仓库,然后git svn提供了dcommit命令,可以将本地git仓库修改,提交到远程的svn仓库。
注意:执行svn dcommit之前,需要养成良好习惯,先更新svn分支改动。
更新svn分支改动:
[cce lang="bash"]
git svn rebase
[/cce]
git svn没有update的概念,因为本地可能有优先于svn仓库。因此,需要采用类似git rebase的概念,先更新svn的提交,然后将git的本地提交重放。所以如果第一个本地提交版本就和svn版本冲突,就等着哭去吧,每次重放可能都要解决冲突,这个时候可能本次再拉一个git分支,采用merge的方式会方便一点。
上面应该是最常用的几个git svn命令,下面是使用过程中一些特殊情况的处理:
创建svn分支:
[cce lang="bash"]
git svn branch -m "message" BRANCH_NAME
[/cce]
看了命令输出就知道了,这样其实就是执行svn copy操作。当然,需要确保SVN_URL/branches目录存在,因为git svn需要知道分支路径(当然也可以在.git/config文件中修,但总是大家都按照规范来比较方便)。创建svn分支之后,可以再用之前的方式将本地git分支切换并关联到这个新创建的svn分支上。
更新svn信息:
[cce lang="bash"]
git svn fetch
[/cce]
如果你的项目svn分支不是你拉的,本地git svn clone的又比较早,你会发现新创建的分支在git branch -r中不存在,也就没法切换过去了。这个时候就需要运行git svn fetch命令,将svn仓库变更同步下来,然后才能对新分支进行操作。
合并svn分支
[cce lang="bash"]
git checkout master
git merge --squash GIT_BRANCH_NAME
git commit
git svn dcommit
[/cce]
和之前说的一样,合并操作需要先合并git仓库。首先先切换到master分支(或者其他引用了svn trunk的git分支),然后进行merge。需要注意的是,merge的时候要使用squash的方式,也就是应用分支改动,但是不修改HEAD。如果直接merge,会把当前分支的远程svn引用也修改,变成svn分支了。然后单独提交,最后提交到svn主干上。
svn目录突然变了:
前段时间配管老是改svn目录,对应git svn引用也需要修改。git svn会在.git/config中增加[svn-remote "svn"]这么一项,里面包含了主干、分支、标签的目录,和svn仓库基础目录。如果原先引用的svn目录变了,这里需要做对应的修改。修改完成后,会发现无法进行git svn rebase操作了,因为远程引用整个变了。没办法,只能先进行git svn fetch,获取新分支,然后重新从新的svn目录中拉分支,进行修改。这样最大的好处,是原先本地git的提交还能够保留。