我将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
我该怎么办?
答案 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
以下步骤让我可以继续进步: -
结帐分店受影响。 git checkout remotes / origin / trunk-4632-jh
这需要一些时间才能完成。
查找有问题的文件已更改的最新修订版。 git svn log dc-smtpd / lib / Qpsmtpd / Address.pm.t
请注意最高版本#
重置回此转速。 git svn reset -r(rev#)-p
答案 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
。