【问题标题】:How can I fix the SVN import line endings error?如何修复 SVN 导入行尾错误?
【发布时间】:2012-04-23 10:57:18
【问题描述】:

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

svnadmin dump . > archive.svn

并将其导入新的:

svnadmin load . < archive.svn

在导入过程中我收到了这个错误:

Cannot accept non-LF line endings in 'svn:ignore' property

我该如何解决这个问题?我可以完全控制两台服务器。

【问题讨论】:

    标签: svn import line-endings


    【解决方案1】:

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

    修复源码(svn:log and 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 是控制字符,即十六进制的 0D。要获得它,请使用 ^V^M (control V control M) 代替 ^M (circumflex M or control M)

    禁用道具验证:

    svnadmin load --bypass-prop-validation . < archive.svn
    

    【讨论】:

    • 请注意,上面的 sed 命令在加载二进制文件时会给我这个错误svnadmin: E200014: Checksum mismatch for。 @tangens sed 对我有用。
    • 我刚刚成功修复了一个转储文件,请看下面的答案
    【解决方案2】:

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

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

    sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/^M/ /' svn.dump > svn.dump.repaired
    

    ^M替换为[blank]很重要,因为属性值的大小不能改变。

    @ventura10 的注释仍然有效:

    ^M 是一个控制字符,即十六进制的 0D。要获得它,请使用 ^V^M (control V control M) 而不是 ^M (circumflex M or control M)

    很难相信将现有存储库从 svn 1.4 升级到 svn 1.7 会使这一步变得必要,但我发现没有其他方法可以摆脱自 svn 1.6 以来不再接受的回车。

    【讨论】:

    • 可以在命令sed -e '/^Prop-content-length: /,/^PROPS-END$/ s/\x0D/ /' svn.dump &gt; svn.dump.repaired中使用HEX值
    【解决方案3】:

    通过一些小技巧,您可以使用svnsync 解决此问题,它可以修复 EOL。假设您的存储库被转储到archive.svn

    首先创建存储库以加载 repo,忽略 EOL 问题:

    svnadmin create repo
    svnadmin load repo < archive.svn --bypass-prop-validation
    

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

    svnadmin create repo-fixed
    

    svnsync 需要一些 pre-commit 钩子,即使你不使用它,所以只需使用你的编辑器在 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 甚至会给你一个好消息:NOTE: Normalized svn:* properties to LF line endings(为什么 Subversion 团队没有更新 svnadmin 来做同样的规范化对我来说是个谜。)

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

    svnadmin dump repo-fixed > archive-fixed.svn
    

    您现在拥有 archive-fixed.svn,它应该与 archive.svn 相同,但 EOL 已根据需要进行了修复。

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

    rm -rf repo-fixed
    

    更新事实证明,如果您加载这个新转储,您的 Subversion 客户端会收到错误:Repository UUID does not match expected UUID。您必须使用 svnadmin setuuid ...change the UUID ID to what it used to be

    (这篇文章是我在网上找到的大量 sn-ps 和部分解决方案的结晶。感谢所有比我了解更多的人;我只是把它们放在一起。)

    另见:

    【讨论】:

    • 干得好!我发现我必须设置钩子的执行位:chmod u+x gjbh-fixed/hooks/pre-revprop-change
    【解决方案4】:

    您是否更改了服务器版本?这是 1.6 中的一个已知问题,从 1.4 或 1.5 开始会导致问题。

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

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

    【讨论】:

    • 我将旧服务器更新到最新版本,但仍然遇到同样的问题。
    • 你之前用的是什么?您是否尝试过设置文件属性以确保使用正确的格式?有一篇很好的帖子 here 解释了如何...
    • 我最终忽略了行尾,并传递给 svnadmin load 的参数
    • 请贴出你用来忽略行尾的参数。
    【解决方案5】:

    使用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 替换为空字符会减少属性内容长度,从而导致错误。

    svndumptool 将分别更改Prop-content-lengthContent-length

    【讨论】:

    • 我刚刚下载安装了svndumptool.py 0.6.1,找不到eolfix-prop命令!
    • 这个命令好像是0.6.1以后才添加的。正如您在this commit 中看到的,它的日期是2013 年。甚至版本0.7.0 commit 也是在2009 年完成的。
    • 那么如何获得这些更高版本?我能找到的最新版本是 0.6.1。
    • @GarretWilson:从 github master 下载即可。
    【解决方案6】:

    我在将 1.6 存储库升级到 1.8 时遇到了这个错误。我在网上找到了一些“修复”。

    --bypass-prop-validation 对我没有吸引力,因为它推迟了问题,下次你需要恢复 repo 时,你会遇到同样的问题。

    我找到了一个 bash 脚本来循环遍历获取 cmets 并再次设置它们的修订,但这不起作用。

    ventura10 解决方案的改进完成了这项工作。由于转储的大小,我最终在恢复转储时使用单个命令删除不需要的字符

        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 (control V control M) 代替 ^M (circumflex M or control M)

    【讨论】:

      【解决方案7】:

      我刚刚成功修复了一个svn转储文件。它的属性中还有一个 CRLF,这导致了 SVN Edge 转储导入中的异常(它们的导入例程非常糟糕)。然后我“安装”了 svnserve 进行测试,这比预期的要容易得多(Windows 操作系统的说明):

      1. 下载并安装 TortoiseSVN 或其他包含 svn 命令行工具的软件。我已经安装好了
      2. 启动cmd.exe,运行svnserve -d。这个 cmd 窗口现在很忙。
      3. 开始另一个cmd.exe创建一个repo:svnadmin create d:\svn_repos\test12
      4. 将转储加载到存储库中:svnadmin load d:\svn_repos\test12 &lt; d:\temp\svn\backup_test.dump

      svnserve 将为您提供失败的详细信息。

      以下是您需要修复的内容(左侧为原件,右侧已修复):

      【讨论】:

        【解决方案8】:

        我使用了svnadmin load --normalize-props {myrepo} &lt; {mydumpfile},效果很好。

        --normalize-props 开关已添加到 subversion 1.10。详情请参考https://subversion.apache.org/docs/release-notes/1.10.html#normalize-props

        为了方便复制 -

        用于 svnadmin 加载的新 --normalize-props 选项

        一个新的 --normalize-props 选项已添加到 svnadmin load 命令中。此选项可用于自动修复 svn:log 或 svn:ignore 等属性中的非 LF 行结尾。这种无效的行尾已被旧服务器接受,并且可以在旧存储库的存储库转储中找到,但被 Subversion 1.6 及更高版本拒绝。

        使用 --normalize-props 调用 svnadmin load 将自动修复在转储流中找到的所有无效属性行结尾,从而确保将适当的值加载到存储库中。

        【讨论】:

        • 它不起作用,我在 svn 版本 1.13 上,不知何故这仍然失败
        • 仅作记录:使用 1.10.4 也没有帮助我。
        【解决方案9】:

        我的问题是提交的评论太大了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多