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