Github Repo Corruption - Sha1 Collision

问题描述 投票:24回答:4

昨天我队的一张签到了我们的github回购。在github上,他们显示了这个错误:

$ git fsck
error: sha1 mismatch 87859f196ec9266badac7b2b03e3397e398cdb18

error: 87859f196ec9266badac7b2b03e3397e398cdb18: object corrupt or missing
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

当我试图拉到另一台机器时,我得到了这个:

Hyperion:Convoy-clone saalon$ git fsck
warning in tree 5b7ff7b4ac7039c56e04fc91d0bf1ce5f6b80a67: contains zero-padded file modes
warning in tree 5db54a0cdcd5775c09365c19c061aff729579209: contains zero-padded file modes
broken link from    tree 6697c12387f8909cfe7250e9d5854fd6713d25c1
              to    blob 87859f196ec9266badac7b2b03e3397e398cdb18
dangling tree 144becf61ae14cec34b6af1bd8a0cf4f00d346d1
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

(我在有问题的机器和我拉到的第二台机器上得到了零填充文件警告。我只在第二台机器上得到了断开的链接错误)。

我将blob跟踪到特定文件,这是问题所在,但在完成Git FAQ修复断链错误的过程后,我没有运气。

我浏览了Github的文档,发现了一个从github中删除主仓库并从违规机器中删除的过程。我试过这个,但是当我去重新推动master分支时,我收到了以下错误:

fatal: SHA1 COLLISION FOUND WITH 87859f196ec9266badac7b2b03e3397e398cdb18 !
error: unpack failed: index-pack abnormal exit

我和Github有一张开放的票,但它会让他们永远回应。知道问题可能是什么? Github是否存在需要修复的问题,或者我可以采取哪些措施来解决这个问题?

git github
4个回答
22
投票

经过GitHub的一些来回(以及来自ssmir的一些故障排除帮助),这个问题在我需要解决的事情和Github需要解决的事情之间分开。

我最终需要解决的是:

Hyperion:Convoy-clone saalon$ git fsck
warning in tree 5b7ff7b4ac7039c56e04fc91d0bf1ce5f6b80a67: contains zero-padded file modes
warning in tree 5db54a0cdcd5775c09365c19c061aff729579209: contains zero-padded file modes
broken link from    tree 6697c12387f8909cfe7250e9d5854fd6713d25c1
              to    blob 87859f196ec9266badac7b2b03e3397e398cdb18
dangling tree 144becf61ae14cec34b6af1bd8a0cf4f00d346d1
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

如果你注意到,从树到blob的链接都是断开的。这是说有一个文件夹应该有一个文件,但实际上并没有文件。有人在他们的本地仓库中添加了一个文件并推送它,但文件本身并没有在远程仓库中结束。现在,每当有人自己拆下回购时,他们就会获得相同的git文件系统链接。

here的说明很好地解释了如果你遇到问题该怎么做,但是在实际的危机中,我发现描述在上下文中有点缺乏。它提供了一个明确的步骤清单,但并不是很清楚原因 - 至少,对于那些对Git还有点新鲜的人来说并非如此。

基本上,你需要做的是弄清楚丢失的blob是什么文件,跟踪最后一台计算机检查它并继续在他们的本地仓库上工作。他们的计算机具有文件的SHA1链接和文件本身的内容。其他人都有一堆破碎。

首先,我们需要找出该树中的blob /文件。为此,您使用git ls-tree。

git ls-tree 6697c12387f8909cfe7250e9d5854fd6713d25c1

就我而言,它只列出了一个文件:损坏的文件。在您的情况下,它可能会提供一个完整的文件列表,在这种情况下,您需要做的是将blob /文件的SHA1哈希与断开的链接错误中提到的哈希匹配。就我而言,就是这样:

100644 blob 87859f196ec9266badac7b2b03e3397e398cdb18    short_description.html

请注意,它没有为您提供该文件实际应该在的目录。这有点令人沮丧,但通过一些小侦探工作,您可以找到它。该文件可能是唯一命名的,在这种情况下,您只需查找文件名即可。或者,您可以查看提交历史记录,查看名为short_description.html的文件的放置时间和位置。

这是GitFaq不完全清楚的部分。他们说重新创建文件,然后运行此命令:

git hash-object -w db/content/page_parts/venues/86/short_description.html 

但那是做什么的?

基本上,当你运行git时,hash-object会返回该文件的sha1哈希值。而且(这里是重要的部分)它从文件中创建了一个blob,而blob正是我们所缺少的。不过,这部分内容尚不清楚:为了使其正常工作,文件需要与最初导致问题的文件完全匹配。换句话说,如果该short_description.html文件中包含内容,则不能只创建一个空白文件并运行hash-object。如果这样做,blob的sha1哈希将与缺少的一个git匹配,并且该断开的链接仍将被破坏。

这就是为什么你需要使用违规机器的回购。其他人都有一个链接,但没有文件,没有blob。违规机器(希望如此)仍然有原始文件。在我的情况下,他们没有原始文件(在我的flailing中,它已被无意删除),但是当我在他们的盒子上查看他们的提交历史时,diff包含已提交的文件的内容但从未成了github。我复制了它,重新创建了文件并运行了hash-object。下次我运行git fsck时,断开的链接消失了。

一个注意事项:从技术上讲,只要您可以重新创建丢失的文件,就可以将此问题修复到其他人的仓库中。在我的情况下,我实际上已经在违规机器上创建了文件,但是通过电子邮件发送给我并将问题修复到另一个系统上的干净仓库中。重要的是重新创建文件,以便生成与repo缺失相同的sha1哈希值。

至于我试图推送到github时遇到的SHA1冲突问题?这个丑陋的傻瓜?

fatal: SHA1 COLLISION FOUND WITH 87859f196ec9266badac7b2b03e3397e398cdb18 !
error: unpack failed: index-pack abnormal exit

这是github方面的一个问题,他们需要修复。


8
投票

只是提醒。事情发生的可能性很小,不可能发生。你可以通过git使用sha-1来获得哈希冲突。一旦你有两个碰撞的文件,可能性就变成了100%。那时,理论上的可能性是微不足道的安慰。添加一个空间,你会没事的。


5
投票

我遇到了同样的问题然后跑了:

git prune  
git gc  

提到了

错误:refs / remotes / origin / ticketName的错误引用

所以我删除了引用并修复了问题:

rm .git/refs/remotes/origin/ticketName

0
投票

这最近发生在AWS Git服务器的“git pull”上。以下命令可解决此问题。谢谢

git prune git gc

© www.soinside.com 2019 - 2024. All rights reserved.