15

我们正在将我们的 SVN 存储库从一台机器移动到另一台机器,随之而来的是新存储库的新域名。问题是,在存储库中,有很多 svn:externals 对存储库中其他项目的引用。例如,我们有 projectA,它在 svn:externals 属性中:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

...等等。所有 URL 都引用了这个特定的域名,因此可以很容易地对其进行解析。已经吸取了教训,我会将这些 URL 迁移为“svn://localhost/”,但我需要找到一种方法来查看存储库历史并重写所有旧 URL,以便我们仍然可以检查这些项目的旧版本没有断开的链接。

我该怎么做呢?

4

6 回答 6

19

我会为此使用SvnDumpTool 。它正是您正在寻找的东西:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

这修复了subversion 1.5 格式的每个外部,并使用相对 URL。

所以 svn:externals 像:

external/libraryA svn://oldserver.net/repo/libraryA

变得:

 /repo/libraryA external/libraryA

使用服务器根相对 URL。

于 2010-08-19T20:47:37.977 回答
8

正如您所指出的,您仍然希望能够检查旧版本,唯一的解决方案是真正“重写”整个历史记录(前面提到的解决方案 D)。

为此,您应该:

1)使用svnadmin dump 转储整个存储库的内容:

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) 编辑转储文件,更改 svn:externals URL。这是最困难的部分:假设存储库也包含二进制数据,在纯文本编辑器中打开转储文件很可能会损坏转储文件。我有使用所谓的“十六进制编辑器”的良好经验,例如免费软件十六进制编辑器 XVI32

3)创建一个新的存储库并将修改后的转储文件加载到其中:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

有关更多信息,您可能还对此链接感兴趣:
http ://svnbook.red-bean.com/en/1.1/ch05s03.html

注意:Subversion 1.5 实际上在 svn:externals 属性中添加了对相对 URL的支持,这可以精确地防止将来出现此类问题:http:
//subversion.tigris.org/svn_1.5_releasenotes.html#externals

于 2008-10-24T15:51:33.550 回答
1

我不得不在 9 个用户和 4 个部署中重新定位 12 个工作副本。这是一个简单的更改,用 IP 替换域,即thing.domain.net -> 192.168.0.1

期望svn relocate像描述的那样表现(遍历嵌套的外部),我编写了一个简单的 DOS 指令来在每个位置运行:

for /D %G in (*) do ( cd ./%G & svn relocate http://thing.domain.net http://192.168.0.1 & cd ..)

这没有按预期工作,只是重新定位父 WC。

我的解决方案是自己编辑存储库(我使用 Tortoise Repo Browser)来更改外部的位置。在此更改之后,只需更新重新定位的父级即可使所有内容保持一致。

让所有 Tortoise 用户清除他们的 URL 历史记录可能是个好主意,这样他们就不会无意中使用旧 URL 执行操作(它仍然存在于 DNS 查找中):

Settings->Saved Data->URL history->Clear

于 2016-03-11T11:27:08.400 回答
1

我用 vi 编辑了我的转储文件,但我必须使用“-b”开关以二进制模式进行编辑,这样任何可以解释为行尾的字符都不会被转换。

例如 vi -b 文件名.dump

此外,我发现,如果您的 URL 长度发生变化,则还必须修改字符串长度。例如,考虑如下所示的条目:

节点路径:trunk/src/include

节点类型:dir

节点动作:改变

道具内容长度:192

内容长度:192

K13

svn:外部

V 156

MGL_ABC svn://server_name/dir1/dir2

MGL_DEF svn://server_name/dir1/dir3

当您修改这些 URL 时,如果字符串的长度发生变化,您还需要更改“192”、“192”和“156”以匹配新的长度。我发现很难计算绝对长度,但很容易找到差异。
例如,假设 URL 1 变短了 3 个字符,而 URL 2 变短了 4 个字符。然后,您必须从这三个字符串长度数字中的每一个中减去“7”。

于 2016-04-09T01:25:51.923 回答
0

你可以:

a) 检查旧版本,并更改​​您的主机文件以将旧名称指向新地址,然后 svn 更新。如果 URL 路径也发生了变化......那么你也可以:

b) 花时间编写一个脚本,在当前(旧版本)工作副本中查找属性并更改那里的 URL,而不提交它们。或者:

c)记下您签入新属性值的修订(-s),签出旧版本,然后简单地将这些修订(-仅影响属性)合并到您的工作副本中。

d)或者,可能,使用 svndump 转储存储库数据,字符串替换转储中的 URL,然后恢复它.. 我不会给你任何保证,甚至可以工作 ;-)

于 2008-10-15T13:40:57.777 回答
0

我所有的外部文件都在名为flow. 我用这个单线(bash shell)修复了我外部的 URL:

for p in $(find -maxdepth 4 -name flow); 做 svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; 完毕
于 2017-05-10T08:44:20.537 回答