26.4 共享git-svn的克隆库
当一个Subversion版本库非常庞大而且还不在同一个局域网内,执行git svn clone可能需要花费很多时间。为了避免因重复执行git svn clone而导致时间上的浪费,可以将一个已经使用git-svn克隆出来的Git库共享,其他人基于此Git进行克隆,然后再用特殊的方法重建和Subversion的关联。还记得之前提到过.git/svn目录下的辅助文件可以重建吗?
例如通过工作区中已经存在的git-svn-demo执行克隆。
$git clone git-svn-demo myclone
Initialized empty Git repository in/path/to/my/workspace/myclone/.git/
进入新的克隆中,会发现新的克隆缺乏跟踪Subversion分支的引用,即refs/remotes/trunk等。
$cd myclone/
$git branch-a
*master
remotes/origin/HEAD->origin/master
remotes/origin/master
remotes/origin/myhack
这是因为Git克隆默认不复制远程版本库的refs/remotes/下的引用。可以用git fetch命令获取refs/remotes的引用。
$git fetch origin refs/remotes/:refs/remotes/
From/path/to/my/workspace/git-svn-demo
*[new branch]demo-1.0->demo-1.0
*[new branch]tags/v1.0->tags/v1.0
*[new branch]trunk->trunk
现在这个从git-svn库中克隆出来的版本库已经有了相同的Subversion跟踪分支,但是.git/config文件还缺乏相应的[svn-remote "svn"]配置。可以通过使用同样的git svn init命令实现。
$pwd
/path/to/my/workspace/myclone
$git svn init-s file:///path/to/svn/repos/demo
$git config—get-regexp 'svn-remote.*'
svn-remote.svn.url file:///path/to/svn/repos/demo
svn-remote.svn.fetch trunk:refs/remotes/trunk
svn-remote.svn.branches branches/:refs/remotes/
svn-remote.svn.tags tags/:refs/remotes/tags/
但是克隆版本库相比用git-svn克隆的版本库还缺乏.git/svn下的辅助文件。实际上可以用git svn rebase命令重建,同时这条命令也可以变基到Subversion相应分支的最新提交上。
$git svn rebase
Rebuilding.git/svn/refs/remotes/trunk/.rev_map.f79726c4-f016-41bd-acd5-6c9ac
b7664b2…
r1=2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4
r2=1863f91b45def159a3ed2c4c4c9428c25213f956
r5=fae6dab863ed2152f71bcb2348d476d47194fdd4
r6=d0eb86bdfad4720e0a24edc49ec2b52e50473e83
r7=69f4aa56eb96230aedd7c643f65d03b618ccc9e5
Done
rebuilding.git/svn/refs/remotes/trunk/.rev_map.f79726c4-f016-41bd-acd5-6c9ac
b7664b2
Current branch master is up to date.
如果执行git svn fetch则会对所有的分支都进行重建。
$git svn fetch
Rebuilding.git/svn/refs/remotes/demo-1.0/.rev_map.f79726c4-f016-41bd-acd5-6c
9acb7664b2…
r3=1adcd5526976fe2a796d932ff92d6c41b7eedcc4
r8=a8b32d1b533d308bef59101c1f2c9a16baf91e48
Done
rebuilding.git/svn/refs/remotes/demo-1.0/.rev_map.f79726c4-f016-41bd-acd5-6c
9acb7664b2
Rebuilding.git/svn/refs/remotes/tags/v1.0/.rev_map.f79726c4-f016-41bd-acd5-6c
9acb7664b2…
r4=c12aa40c494b495a846e73ab5a3c787ca1ad81e9
Done
rebuilding.git/svn/refs/remotes/tags/v1.0/.rev_map.f79726c4-f016-41bd-acd5-6
c9acb7664b2
至此,从git-svn克隆库二次克隆的Git库,已经和原生的git-svn库一样使用git-svn命令了。