移动git管理的svn版本库的路径

一、起因

公司采用svn管理源码,因此我一直是用git svn来与svn服务器进行同步。由于当前工作的版本库中包含多个项目,而权限也没有细分,所以每个使用版本库的人都可以管理其他人的项目。这样一旦出现误操作,就会非常难以恢复。我前段时间就 碰上了这样的事情,还好找回了大部分的文件。

解决的办法有两个:

  1. 自己单独使用git管理源码
  2. 新建一个独立的svn库并设定独立权限

在windows server 2003上通过cygwin安装git服务器未果后,我只能选择后者了。

二、svn部分

当前工作的版本库的路径为: http://10.0.0.5:8080/svn/kaitian/trunk/fight/KTFight ,其中kaitian是该版本库的根目录。

我在服务器上新建了一个版本库,名为ktfight,路径为:http://10.0.0.5:8080/svn/ktfight ,希望这个版本库对应 http://10.0.0.5:8080/svn/kaitian/trunk/fight 的所有内容。

然后就是转移版本库的工作。原本考虑使用svnsync命令,但发现这个命令仅能sync根目录,不支持子目录。而我不希望新的版本库中保留原来版本库的其他项目的内容,放弃。

后来确定的命令是svndumpfilter,操作如下:

1#备份原始版本库
2svnadmin dump kaitian > kaitian.dump
3#将备份的版本库进行过滤
4type kaitian.dump | svndumpfilter include trunk/fight > fight.dump

这样就得到了一个过滤后的版本库,只包含需要的项目。

原来的项目的路径(相对于版本库根目录)实在很长,可以通过查找和替换缩短路径,方法如下:

使用WinHex打开fight.dump,搜索trunk/fight,将其替换为trunk。这里我原本打算将其直接放在根目录,但替换为/或者替换为空导致最后倒入都不成功,因此就改为替换成trunk了。能短一点就短一点吧。见下面两张图。

1#创建新的版本库
2svnadmin create ktfight
3#载入过滤后的版本库
4svnadmin load ktfight < fight.dump

三、git部分

现在需要将git项目指向新的svn文件夹,我开始的想法是直接修改配置文件中的路径。
在原来的git项目下输入git svn info,可以看到svn服务器的信息,这里的信息还是指向原来的路径:

 1$git svn info
 2Path: .
 3URL: http://10.0.0.5:8080/svn/kaitian/trunk/fight/KTFight
 4Repository Root: http://10.0.0.5:8080/svn/kaitian
 5Repository UUID: b60ff3ac-2211-494c-89f2-e927ee7ddff6
 6Revision: 191
 7Node Kind: directory
 8Schedule: normal
 9Last Changed Author: zrong
10Last Changed Rev: 191
11Last Changed Date: 2011-03-31 05:25:13 +0000 (星期四, 31 三月 2011)

修改配置文件中的路径:

1git config svn-remote.svn.url http://10.0.0.5:8080/svn/ktfight/trunk/KTFight
2vim .svn/.metadata

可以看到.metadata中的内容如下,注释提醒不应该进行编辑:

; This file is used internally by git-svn
; You should not have to edit it
[svn-remote "svn"]
reposRoot = http://gameserver:8080/svn/ktfight
uuid = b60ff3ac-2211-494c-89f2-e927ee7ddff6

修改reposRoot的值为版本库的根路径(http://10.0.0.5:8080/svn/ktfight)后保存。

使用git svn info查看新的svn信息。

如果成功,恭喜你!!!你比我人品好1000倍!

我当然是没有成功的,看来注释中的提示还是应该遵守DI Orz……

git的错误提示如下:

Unable to determine upstream SVN information from working tree history

于是我使用了一个更笨的方法:

1 git svn clone http://10.0.0.5:8080/svn/ktfight/trunk/KTFight

虽然笨,但够直接。

参考:http://www.aspzz.com.cn/c/man/svn/svn-ch-5-sect-3.html#svn-ch-5-sect-3.1.3

(全文完)