我们正在移动的过程中,我们SVN仓库到另一台机器之一,并与将来的一个新的域名于新的回购。问题是,在储存库中,有许多svn:外部引用的其他项目内的资料库。例如,我们有将,已在svn:外部特性:

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

...等。所的网址参考这个特定的域名,所以它可以容易地进行分析。已经学到了我的教训,我将迁移这些网址是"svn://localhost/",但我需要找到一种方式去通过库的历史和改写了所有的旧址,因此,我们仍然可以查阅的老年修订的这些项目没有具有破碎的链接。

我怎么会去做这个?

有帮助吗?

解决方案

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

要做到这一点,你应该:

1)使用整个存储库的内容title =“svnadmin dump”> 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。 这是最困难的部分:假设存储库也包含二进制数据,在纯文本编辑器中打开转储文件很可能会破坏转储文件。我使用所谓的“十六进制编辑器”有很好的经验,例如免费软件Hex Editor XVI32

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

$ 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

其他提示

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

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

这会修复颠覆1.5格式的每个外部内容,并使用相对URL。

所以svn:externals如:

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

成为:

 /repo/libraryA external/libraryA

使用服务器根目录相对URL。

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

期望 svn relocate 按照描述的行为(遍历嵌套外部)我写了一个简单的DOS指令在每个位置运行:

for / D%G in(*)do( cd ./%G &安培; svn重新定位http://thing.domain.net http://192.168.0.1 &安培; cd ..)

这没有按预期工作,只是重新安置了家长WC。

我的解决方案是编辑存储库本身(我使用Tortoise Repo Browser)来改变外部的位置。在此更改之后,重新定位的父级的更新就是将所有内容排成一行所需的全部内容。

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

设置 - &gt;保存的数据 - &gt;网址历史记录 - &gt;清除

我用vi编辑了我的转储文件但是我不得不使用“-b”切换到以二进制模式编辑,以便任何可以解释为行结尾的字符都不会被转换。

e.g。 vi -b filename.dump

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

节点路径:trunk / src / include

Node-kind:dir

节点动作:改变

Prop-content-length:192

内容长度:192

K13

的svn:外部对象

V 156

MGL_ABC svn:// server_name / dir1 / dir2

MGL_DEF svn:// server_name / dir1 / dir3

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

你可以:

a)检查旧的订正,并且改变你的主人-文件要点的旧名称到新的地址,然后svn更新。在情况下的URL-路还改变了...那么你可能会以及:

b)需要时间编写的脚本中发现的性质在目前的(旧版本-)的工作复制和变化的网址,在那里,没有犯他们。或者:

c)请注意修订(s)在这里你检查,在新的房产价值,检查了旧版本,并且需要合并这些修订(-这只影响的特性)插入你的工作副本。

d)或可能使用svndump要转储的数据库,弦更换的网址在场,然后恢复它。我不会给你任何保证,即使工作;-)

我的所有外部都在名为 flow 的目录中。我使用这个单行(bash shell)修复了我的外部URL:

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top