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