26.2.2 Git工作分支和Subversion如何对应

    Git默认的工作分支是master,而看到上例中的Subversion主线在Git中对应的远程分支为refs/remotes/trunk。那么在执行git svn rebase时,git-svn是如何知道当前的HEAD对应的分支是基于哪个Subversion跟踪分支进行的变基呢?还有就是执行git svn dcommit时,当前的工作分支应该将改动推送到哪个Subversion分支中去呢?

    很自然地会按照Git的方式进行思考,期望在.git/config配置文件中找到类似[branch master]之类的配置小节。实际上,在git-svn的Git库的配置文件中可能根本就不存在[branch……]小节。那么git-svn是如何确定当前Git工作分支和远程Subversion版本库的分支建立了对应呢?

    其实奥秘就在Git的日志中。当在工作区执行git log时,会看到包含git-svn-id:标识的特殊日志。发现的最近的一个git-svn-id:标识会确定当前分支提交的Subversion分支。

    下面继续上一节的示例,先切换到分支,并将提交推送到Subversion的分支demo-1.0中,具体操作过程如下。

    (1)首先在Git库中会看到有一个对应于Subversion分支的远程分支和一个对应于Subversion里程碑的远程引用。


    $git branch-r demo-1.0 tags/v1.0 trunk

    (2)然后基于远程分支demo-1.0建立本地工作分支myhack。


    $git checkout-b myhack refs/remotes/demo-1.0 Switched to a new branch'myhack' $git branch master *myhack

    (3)在myhack分支做一些改动并提交。


    $echo "Git">>README $git add-u $git commit-m "say hello to Git." [myhack d391fd7]say hello to Git. 1 files changed,1 insertions(+),0 deletions(-)

    (4)下面看看Git的提交日志。


    $git log—frst-parent commit d391fd75c33f62307c3add1498987fa3eb70238e Author:Jiang Xin<jiangxin@ossxp.com> Date:Fri Nov 5 09:40:21 2010+0800 say hello to Git. commit 1adcd5526976fe2a796d932ff92d6c41b7eedcc4 Author:jiangxin<jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2> Date:Mon Nov 1 05:54:19 2010+0000 new branch:demo-1.0 git-svn-id:file:///path/to/svn/repos/demo/branches/demo-1.0@3 f79726c4-f016-41bd-acd5-6c9acb7664b2 commit 1863f91b45def159a3ed2c4c4c9428c25213f956 Author:jiangxin<jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2> Date:Mon Nov 1 05:49:41 2010+0000 hello git-svn-id:file:///path/to/svn/repos/demo/trunk@2 f79726c4-f016-41bd-acd5-6c9acb7664b2 commit 2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4 Author:jiangxin<jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2> Date:Mon Nov 1 05:47:03 2010+0000 initialized. git-svn-id:file:///path/to/svn/repos/demo/trunk@1 f79726c4-f016-41bd-acd5-6c9acb7664b2

    (5)看到了上述Git日志中出现的第一个git-svn-id:标识的内容为:


    git-svn-id:file:///path/to/svn/repos/demo/branches/demo-1.0@3 f79726c4-f016-41bd-acd5-6c9acb7664b2

    这就是说,当需要将Git提交推送给Subversion服务器时,需要推送到地址:file:///path/to/svn/repos/demo/branches/demo-1.0。

    (6)执行git svn dcommit,果然是推送到Subversion的demo-1.0分支。


    $git svn dcommit Committing to file:///path/to/svn/repos/demo/branches/demo-1.0… M README Committed r8 M README r8=a8b32d1b533d308bef59101c1f2c9a16baf91e48(refs/remotes/demo-1.0) No changes between current HEAD and refs/remotes/demo-1.0 Resetting to the latest refs/remotes/demo-1.0