校验和与'git svn clone'不匹配后如何恢复?

时间:2014-08-20 10:55:51

标签: migration git-svn

我将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尚未发挥作用,因为回购未完全到位:

$ 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

我该怎么办?

4 个答案:

答案 0 :(得分:3)

我知道这已经过时但可能对将来的参考有所帮助,因为所有搜索结果都没有帮助。

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

我认为你需要尝试创建一个分支并检查你之前获取的提交中的提交:

git checkout -b master git-svn

完成此操作后, 应该具有该提交的工作树。由于对象不匹配,另一次提取可能会失败,但至少应该可以使用“git svn reset”来恢复错误的svn提取(请参阅OP的相关答案链接)。如果这是真的发现违规提交,请在它之前重置,然后继续提取。

你可能想要在你的主分支上的破坏提交之前重新定义并恢复到状态,或者转换回裸存储库,如果那是你所追求的(在我的情况下)。

希望这有效。我会在结帐时发布更新(至少需要几个小时... 叹息)。

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

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

干杯,

亨里克

答案 1 :(得分:2)

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

我认为此问题是由于传输过程中文件损坏而导致的。不确定它是如何或为什么发生的,但在我的情况下,每次进行新的克隆时,我都会在不同的版本中得到相同的错误,有时根本不会。

使用提问者错误消息

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

以下步骤让我可以继续进步: -

  1. 查看所有分支机构。这些都是远程分支。 git branch -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
  6. 祝你好运。

答案 2 :(得分:0)

另请参阅:Git svn rebase : checksum mismatch

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

通过注释掉

,在Apache的 /etc/httpd.conf 文件中禁用SSI以进行迁移
 AddType text/html .shtml
 AddOutputFilter INCLUDES .shtml

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

答案 3 :(得分:0)

这意味着存储库中的某些文件已损坏。它可能是由各种原因造成的,例如软件错误,驱动器中的位腐烂等。我最近将非常老的~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

一些常见错误和解决方案:

  • ' dumpstream中内容数据的提前结束':这意味着某些文件的内容长度与存储库版本不匹配,因此某些数据在指定文件中丢失。我们必须跳过它。像这样添加| 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命令

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

祝你好运!