如何修复SVN导入行结尾错误?

xsl*_*xsl 9 svn import line-endings

我必须导入一个巨大的SVN存储库,我必须从一个服务器转移到另一个服务器.所以我从旧服务器导出它:

svnadmin dump . > archive.svn
Run Code Online (Sandbox Code Playgroud)

并将其导入新的:

svnadmin load . < archive.svn
Run Code Online (Sandbox Code Playgroud)

在导入过程中,我收到此错误:

Cannot accept non-LF line endings in 'svn:ignore' property
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?我完全控制了两台服务器.

ven*_*a10 11

您有2个选项,修复源或禁用道具验证.

修复源代码(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
Run Code Online (Sandbox Code Playgroud)

其中^ M是控制字符,表示0D为十六进制.为了得到它使用^ V ^ M(控制V控制M)而不是^ M(抑扬M或控制M)

禁用道具验证:

svnadmin load --bypass-prop-validation . < archive.svn
Run Code Online (Sandbox Code Playgroud)


tan*_*ens 6

@ ventura10的回答的第一个选项听起来不错,但没有工作对我来说.该sed命令更改了属性部分之外的某些版本化内容,导致在加载转储时导致md5不匹配.

因为我的存储库没有包含二进制内容的属性,所以我更改了sed命令以更正所有属性而不仅仅是svn:logsvn:ignore.我也确定没有版本化的文件包含一行开头Prop-content-length:.否则我在加载转储时会出错.

sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/^M/ /' svn.dump > svn.dump.repaired
Run Code Online (Sandbox Code Playgroud)

替换^M为 重要[blank],因为属性值的大小不得更改.

@ ventura10的注释仍然有效:

^ M是控制字符,表示十六进制的0D.为了得到它使用^ V ^ M(控制V控制M)而不是^ M(抑扬M或控制M)

很难相信将现有的存储库从svn 1.4升级到svn 1.7会使这一步变得简单,但我找不到其它方法来摆脱自svn 1.6以来不再接受的回车.


Gar*_*son 5

稍加操练,您可以使用svnsync来解决此问题,该工具具有修复EOL的功能。假设您的存储库转储到中archive.svn

首先创建存储库以加载回购仓库,而忽略EOL问题:

svnadmin create repo
svnadmin load repo < archive.svn --bypass-prop-validation
Run Code Online (Sandbox Code Playgroud)

现在创建一个新的存储库以复制到:

svnadmin create repo-fixed
Run Code Online (Sandbox Code Playgroud)

svnsync即使您不使用它,也需要一些预提交的钩子,因此只需使用编辑器在以下位置创建一个空钩子repo-fixed/hooks/pre-revprop-change

#!/bin/sh
exit 0
Run Code Online (Sandbox Code Playgroud)

初始化目标存储库svnsync

svnsync init file:///path/to/repo-fixed file:///path/to/repo
Run Code Online (Sandbox Code Playgroud)

现在复制整个存储库:

svnsync sync file:///path/to/repo-fixed
Run Code Online (Sandbox Code Playgroud)

ew!svnsync甚至会给您带来一个好消息:(NOTE: Normalized svn:* properties to LF line endings为什么Subversion团队没有更新svnadmin以进行相同的归一化,这对我来说还是个谜。)

完成后,转储新的存储库:

svnadmin dump repo-fixed > archive-fixed.svn
Run Code Online (Sandbox Code Playgroud)

现在archive-fixed.svn,您具有,archive.svn除了已根据需要修复了EOL之外,该功能应与其他功能相同。

(可选)您现在可以删除用于以下用途的临时存储库svnsync

rm -rf repo-fixed
Run Code Online (Sandbox Code Playgroud)

更新事实证明,如果您加载此新转储,则Subversion客户端会收到错误:Repository UUID does not match expected UUID。你必须使用svnadmin setuuid ...的UUID ID更改为它曾经是

(这篇文章是我在网络上找到的众多摘要和部分解决方案的总结。感谢所有比我了解更多的人;我将所有这些放在一起。)

也可以看看:

  • 做得好!我发现我必须设置钩子的执行位:chmod u+x gjbh-fixed/hooks/pre-revprop-change (2认同)

小智 4

您是否更改过服务器版本?这是 1.6 中的一个已知问题,并且从 1.4 或 1.5 升级时会导致问题。

Subversion 1.6 不再接受属性文件中的回车符 (^M)。您需要修复 svn:ignore 文件中的换行符,或者重新创建(如果这样更容易)。

或者,您可以选择Subversion 1.7或使用uberSVN