我需要导入一个巨大的 SVN 代码仓库,需要将其从一个服务器转移到另一个服务器。因此,我从旧服务器导出了它:
svnadmin dump . > archive.svn
并在新的上导入:
svnadmin load . < archive.svn
在导入过程中,我遇到了这个错误:Cannot accept non-LF line endings in 'svn:ignore' property
我该如何解决这个问题?我对两台服务器都有完全的控制。
我需要导入一个巨大的 SVN 代码仓库,需要将其从一个服务器转移到另一个服务器。因此,我从旧服务器导出了它:
svnadmin dump . > archive.svn
并在新的上导入:
svnadmin load . < archive.svn
在导入过程中,我遇到了这个错误:Cannot accept non-LF line endings in 'svn:ignore' property
我该如何解决这个问题?我对两台服务器都有完全的控制。
你有两个选择,修复源代码或禁用属性验证。
修复源代码(svn:log和svn:ignore):
sed -e '/^svn:log$/,/^K / s/^M/ /' -e '/^svn:ignore$/,/^PROPS-END$/ s/^M/\n/' archive.svn > repaired-archive.svn
svnadmin load . < repaired-archive.svn
其中^M是一个控制字符,表示16进制中的0D。要获取它,请使用^V^M(控制V控制M),而不是 ^M(插入符号M或控制M)。
禁用属性验证:
svnadmin load --bypass-prop-validation . < archive.svn
svn:log
和svn:ignore
。我也确定没有版本化的文件包含以Prop-content-length:
开头的行。否则,在加载转储时我会遇到错误。sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/^M/ /' svn.dump > svn.dump.repaired
^M
替换为[空格]
,因为属性值的大小不应改变。sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/\x0D/ /' svn.dump > svn.dump.repaired
中使用十六进制值。 - ceilfors通过使用svnsync
,您可以轻松解决此问题,并具有修复EOL的能力。假设您的存储库已转储到archive.svn
中。
首先创建要加载存储库的存储库,忽略EOL问题:
svnadmin create repo
svnadmin load repo < archive.svn --bypass-prop-validation
svnadmin create repo-fixed
svnsync
需要一些预提交钩子,即使您不使用它,因此只需使用编辑器在repo-fixed/hooks/pre-revprop-change
中创建一个空的预提交钩子:
#!/bin/sh
exit 0
为 svnsync
初始化目标仓库:
svnsync init file:///path/to/repo-fixed file:///path/to/repo
svnsync sync file:///path/to/repo-fixed
哇!svnsync
甚至会给你好消息:注意:将svn:*属性标准化为LF换行符结束符
(为什么Subversion团队没有更新svnadmin
执行相同的标准化,这对我来说是个谜。)
完成后,转储新存储库:
svnadmin dump repo-fixed > archive-fixed.svn
现在您有了archive-fixed.svn
,它应该与archive.svn
完全相同,只是必要时已经修复了EOLs。
(可选) 您现在可以删除用于svnsync
的临时仓库:
rm -rf repo-fixed
更新:如果您加载此新转储,则Subversion客户端会出现错误:Repository UUID does not match expected UUID
。您需要使用svnadmin setuuid ...
将UUID ID更改为以前的ID。(更改UUID ID为以前的ID)。使用svndumptool:
svndumptool.py eolfix-prop svn:ignore svn.dump svn.dump.repaired
@tangens的解决方案对我也有效,但它并不完美,因为我得到了一个额外的空格字符来替换回车符。然而,我已经测试过svn:ignore仍然可以使用这个额外的空格,但我没有测试其他的SVN属性。
使用svndumptool的缺点是它只能一次处理一个svn属性,如果你的转储文件很大,那么会很耗时。
一些发现
你可能会好奇为什么@tangens没有用空字符替换^M。如果你尝试用空字符替换它,你会得到这个错误:
svnadmin: E140001: Dumpstream data appears to be malformed
Prop-content-length
属性,该属性将与实际内容匹配。 将^M替换为空字符将减少属性内容长度,因此会出现错误。Prop-content-length
和Content-length
。 sed -e '/^svn:log$/,/^K / s/^M/ /' -e '/^svn:ignore$/,/^PROPS-END$/ s/^M/\n/' /path/to/svn.dump | svnadmin load /path/to/repo
注意:
^M是一个控制字符,它在十六进制中表示0D。要获取它,请使用^V^M(控制V控制M)代替^M(插入符M或控制M)。
我使用了svnadmin load --normalize-props {myrepo} < {mydumpfile}
,它完美地工作了。
选项--normalize-props
是在subversion 1.10中添加的。有关详细信息,请参阅https://subversion.apache.org/docs/release-notes/1.10.html#normalize-props
为方便起见再次复制 -
新的--normalize-props选项用于svnadmin load
svnadmin load命令已添加了一个新的--normalize-props选项。可以使用此选项自动修复属性(例如svn:log或svn:ignore)中的非LF行结尾。旧服务器接受此类无效行结尾,并且可以在旧存储库的存储库转储中找到它们,但是Subversion 1.6及更高版本会拒绝它们。
使用--normalize-props调用svnadmin load将自动修复在转储流中发现的所有无效属性行结尾,从而确保适当的值加载到存储库中。
cmd.exe
,运行svnserve -d
。此cmd窗口现在正在忙碌。cmd.exe
创建一个repo:svnadmin create d:\svn_repos\test12
svnadmin load d:\svn_repos\test12 < d:\temp\svn\backup_test.dump
svnserve会给你详细的失败信息。
我的问题是提交的注释太长了。