【问题标题】:How can I recover after a checksum mismatch with 'git svn clone'?在与“git svn clone”校验和不匹配后如何恢复?
【发布时间】:2014-08-20 10:55:51
【问题描述】:

作为我们迁移计划的一部分,我正在将一个 SVN 存储库克隆到 git。在此过程中我遇到了各种障碍,迫使我使用git svn fetch 命令继续克隆。最近的一次失败我不知道怎么解决:

$ git svn fetch
Checksum mismatch: dc/trunk-4632-jh/dc-smtpd/lib/Qpsmtpd/Address.pm.t 8ce3aea3f47dc115e8fe53bd62d0f074cfe93ec6
expected: 59de969022e46135fa6dc7599fc2f3b4
     got: 4334926a01c905cdb7fce71265e370c1

我找到了this related answer,但是该解决方案不起作用,因为git svn log 还没有起作用,因为 repo 还没有完全到位:

$ git svn log dc/trunk-4632-jh/dc-smtpd/lib/Qpsmtpd/Address.pm.t
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
log --no-color --first-parent --pretty=medium HEAD: command returned error: 128

我该如何继续?

【问题讨论】:

    标签: migration git-svn


    【解决方案1】:

    另一个老问题的答案,但很难找到直接的解决方案来解决这个问题,所以希望这对其他人有帮助。

    我认为此问题是由于传输过程中文件损坏所致。不知道它是如何发生的或为什么会发生,但就我而言,每次我进行新的克隆时都会在不同的修订版中遇到相同的错误,有时根本不会。

    使用提问者错误信息

    $ git svn fetch
    Checksum mismatch: dc/trunk-4632-jh/dc-smtpd/lib/Qpsmtpd/Address.pm.t 
    8ce3aea3f47dc115e8fe53bd62d0f074cfe93ec6
    expected: 59de969022e46135fa6dc7599fc2f3b4
    got: 4334926a01c905cdb7fce71265e370c1
    

    以下步骤使我能够恢复和进步:-

    1. 查看所有分支。这些都将是远程分支。 git 分支 -a

    2. 结帐分支受到影响。 git checkout remotes/origin/trunk-4632-jh

      这需要一些时间才能完成。

    3. 查找问题文件被更改的最后一个版本。 git svn log dc-smtpd/lib/Qpsmtpd/Address.pm.t

      注意最高版本#

    4. 重置回此版本。 git svn reset -r (rev #) -p

    5. 继续。 git svn fetch

    祝你好运。

    【讨论】:

    • 在我的情况下运行第 3 步 git svn log 时只需获取“致命:您当前的分支似乎已损坏”:-(
    • 为我工作,谢谢
    【解决方案2】:

    我知道这是旧的,但也许它会对将来的参考有所帮助,因为关于此的所有搜索结果都没有帮助。

    我在我们庞大的存储库上遇到了类似的问题,需要数天时间才能克隆,不幸的是,我不得不重新启动我的机器。我目前正在研究如何解决这个问题,所以请记住,这更像是一个建议而不是经过测试的解决方案。

    我认为您需要尝试创建一个分支并检查您当前从之前的 fetch 中获得的提交:

    git checkout -b master git-svn
    

    完成后,您应该拥有直到该提交的工作树。由于对象不匹配,另一个提取可能会失败,但至少应该可以使用“git svn reset”来恢复错误的 svn 提取(参见 OP 的相关答案链接)。如果这是真的找到有问题的提交,在它之前重置,然后继续获取。

    您可能希望在您的主分支上进行损坏的提交之前重新设置基准并恢复到状态,或者转换回裸存储库,如果这是您所追求的(在我的情况下)。

    希望这可行。结帐完成后我会发布更新(至少需要几个小时...sigh)。

    编辑:这似乎有效。我成功地丢弃了一些 git-svn 提交,并且能够再次重新获取它们。 :)

    Edit2:确保重置,直到您在 git svn fetch 上没有收到任何对象不匹配警告(否则您很快就会遇到同样的问题)。

    干杯,

    亨利克

    【讨论】:

      【解决方案3】:

      另请参阅:Git svn rebase : checksum mismatch

      在我们的例子中,对文件的额外处理(Apache 中的服务器端包含)导致了校验和问题。

      通过注释掉 Apache 的 /etc/httpd.conf 文件在迁移期间禁用 SSI

       AddType text/html .shtml
       AddOutputFilter INCLUDES .shtml
      

      指令解决了由前端 Apache 服务器对 .shtml 文件的解释引起的问题,它产生了一个新的内容(因此产生了一个新的哈希),而不是原始文件本身的哈希。

      【讨论】:

      • 如果我可以让你的答案摆脱否定,我会支持更多。这正是我公司的问题。非常感谢你!!我花了很长时间弄乱其他答案,说这是由于 SVN 数据库损坏或结帐失败......但这解决了我的问题。我已经向 IT 部门开了一张票,让他们修复他们的配置。
      【解决方案4】:

      这意味着存储库中的某些文件已损坏。它可能是由各种原因引起的,例如软件错误、驱动器中的位损坏等。我最近正在将非常旧的 ~10GB svn 存储库转换为 git,因此预计会出现一些损坏。

      要修复损坏,您基本上需要转储整个存储库并导入它,同时过滤掉错误。请注意,我们的目标是完成导入过程,无论存储库为何或如何损坏。如果没有备份和比较修订文件,您不能简单地修复损坏。

      您可以使用的第一个基本一次性命令是:

      svnadmin create repo2
      svnadmin dump repo | sed '/^Text-content-md5/d' | svnadmin load repo2
      

      这会从转储中删除校验和计算,因此新的 repo 将具有更新的校验和。

      如果您在转储和加载过程中遇到更多错误(这是预期的),请尝试增量方法,以便您可以从离开的点继续。下面的命令将转储从 101 到 150(含)的修订。

      svnadmin dump --incremental -r101:150 repo | sed '/^Text-content-md5/d' | svnadmin load repo2
      

      一些常见错误及解决方法:

      • '转储流中的内容数据过早结束':表示某些文件的内容长度与存储库版本不匹配,因此指定文件中的某些数据丢失。我们必须跳过它。像这样添加| svndumpfilter exclude path/to/file.jar 命令:

        svnadmin dump --incremental -r101:150 repo | svndumpfilter exclude path/to/file.jar | sed '/^Text-content-md5/d' | svnadmin load repo2
        
      • 属性错误:将--bypass-prop-validation 添加到svnadmin load 命令

      填充第二个 repo 后,您只需 svnserve -d -r repo2 并再次尝试 git svn fetch

      祝你好运!

      【讨论】:

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