我们正在将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,这样我们仍然可以查看这些项目的较旧版本没有断开链接。
我将如何做到这一点?
答案 0 :(得分: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 format的每个外部广告,并使用相对网址。
所以svn:externals如:
external/libraryA svn://oldserver.net/repo/libraryA
成为:
/repo/libraryA external/libraryA
使用服务器根目录相对URL。
答案 1 :(得分:7)
正如您所说,您仍然希望能够查看较旧的版本,唯一的解决方案是“重写”整个历史记录(前面提到的解决方案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。 这是最困难的部分:假设存储库也包含二进制数据,在纯文本编辑器中打开转储文件很可能会破坏转储文件。我使用所谓的“十六进制编辑器”有很好的经验,例如Freeware 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
答案 2 :(得分: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
强> 的
答案 3 :(得分:1)
我用vi编辑了我的转储文件,但我不得不使用&#34; -b&#34;切换到以二进制模式编辑,以便任何可以解释为行结尾的字符都不会被转换。
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
修改这些网址时,如果字符串的长度发生变化,您还需要更改&#34; 192&#34;,&#34; 192&#34;和&#34; 156&#34;匹配新的长度。 我发现很难计算绝对长度但很容易找到差异 例如,假设URL 1缩短3个字符,URL 2缩短4个字符。然后,你必须减去&#39; 7&#39;从这三个字符串长度数字中的每一个。
答案 4 :(得分:0)
你可以:
a)检查旧版本,并更改hosts-file以将旧名称指向新地址,然后svn update。如果URL路径也发生了变化......那么您也可以:
b)花时间编写一个脚本,在当前(旧版本)工作副本中查找属性并更改其中的URL,而不提交它们。 OR:
c)记下您在新属性值中签入的修订版本(-s),检查旧版本,然后将这些修订版本(仅影响属性)合并到工作副本中。
d)或者,可能使用svndump转储存储库数据,字符串替换转储中的URL,然后将其还原..我不会保证这甚至可以正常工作; - )
答案 5 :(得分:0)
我所有的外部都在名为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