git提交停止工作 - 构建树时出错

109

我无法提交更改:

$ git commit
error: invalid object 100644 13da9eeff5a9150cf2135aaed4d2e337f97b8114 for 'spec/routing/splits_routing_spec.rb'
error: Error building trees

我迄今为止尝试过:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114

并且还有:

$ git prune
error: Could not read 1394dce6fd1ad15a70b2f2623509082007dc5b6c
fatal: bad tree object 1394dce6fd1ad15a70b2f2623509082007dc5b6c

还有:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114

但是没有任何帮助。我应该删除文件,提交并重新引入吗?如果这样做可以恢复git提交,我愿意失去一点历史记录。

18个回答

174
这个错误意味着您有一个哈希值为13da9eeff5a9150cf2135aaed4d2e337f97b8114的文件,而且该哈希值不在.git/objects/../中,或者它是空的。当出现此错误时,我只在错误信息中看到了此哈希值,没有文件路径。然后我尝试执行git gc --autogit reset --hard。在这些命令中的其中一个(这些命令没有解决我的问题)之后,我得到了触发错误的文件路径。
您只需要生成对象哈希值:
git hash-object -w spec/routing/splits_routing_spec.rb

了解更多信息,请参见 文档。 在文档中,还有一种修复此错误的额外方法。

P.S. 这是我唯一有用的方法。


2
我已经尝试了这个方法,它可以解决问题,但是下次再提交时错误又会出现,有没有什么永久性的解决方法? - NotSoShabby
1
我遇到了多个损坏的文件,即使在所有文件上运行了上述命令后,git 仍然生成致命错误而没有指向特定的文件。我运行了 "git hash-object -t ." 来重新生成所有文件的哈希值,然后问题就解决了。 - user1097111
@AnkurRaiyani 你放在哪个路径下了? - Alex Nikulin
@AlexNikulin 文件在哪里,我把路径放在这个命令中。 - Ankur Raiyani
@AnkurRaiyani 这意味着你输入了错误的路径 :) - Alex Nikulin
显示剩余5条评论

23

你的git存储库中可能有一个损坏的对象。

如果您有远程存储库或其他此存储库的克隆版本,您可以从那里获取有问题的文件,并在本地存储库中进行替换。

您想要的文件应该在以下位置:

/repo/.git/objects/13/da9eeff5a9150cf2135aaed4d2e337f97b8114

3
在我的情况下,被引用的文件已经不在.git对象文件夹中了! >.< - mix3d
8
下面@AlexNikulin的回答是更好的解决方案:git hash-object -w spec/routing/splits_routing_spec.rb - sagannotcarl
7
我给这个回答踩了反对票,因为 git hash-object -w 对我来说效果更好。 - Nikos Alexandris
这是最有用的答案,应该在顶部。我没有我的存储库副本来恢复片段。 - Charley Ramm
在我的情况下,它对于一次推送有所帮助。然后@Alex的答案解决了问题。 - Vit
显示剩余2条评论

17

git reset --hard会将你的仓库重置回正常状态,但是你会失去未提交的更改。


11
$ git reset --hard gives 致命错误:无法读取树形结构2287adf1b2a974541ce5806abc23dbd79814d666 - gorn
2
这个网址(https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F)可能会有所帮助。 - Tom Macdonald
3
+1 reset --hard 对我很有效。我的问题是Google Drive在多台计算机上同步我的本地代码 - 你必须记得停止并重新启动它才能让它同步。我认为谷歌云盘必须有意忽略监视.git目录,因为会有大量更改。 - eduncan911

13

这篇 Medium 文章中提到的一个简单技巧解决了我遇到类似“无效对象”和“构建树错误”的问题。 解决方案非常简单:

git hash-object -w <file-name-which-is-creating-problem>

然后,git会为那些哈希值不匹配的文件创建一个Sha1,并修复它们所在的存储库。

现在我可以毫无问题地使用git add *git commit -m。就是这样。

注意: 如果您不确定自己在做什么,请创建一个备份副本。


这就是解决我的方法,以上所有答案都没有起作用。 - Adam B

10
如果有问题的文件是由您的更改添加的,您可以将其从索引中删除,然后再次添加:
git reset <file> 
git add <file>

3
如果磁盘驱动器中的文件已经丢失,这种方法将无法奏效;因为没有实际的文件可供重置,你会收到一个“fatal: ambiguous argument 'path/to/file.ext': unknown revision or path not in the working tree.”的错误信息。 - mix3d

7
在我的情况下,我通过以下方式解决了这个问题:
git reset --mixed

错误:无法读取test.ts的sha1文件(52e55168ebc6e4073b5935bced17f1cde7c50fad) 致命错误:无法将索引文件重置为修订版本“HEAD”。 - titusfx

7

对我来说,这只是一个权限问题。当我使用sudo时,它可以工作。可能与Mac环境有关。


“sudo” 权限太宽了,但问题确实是权限问题。通过将整个文件夹的所有权恢复到正确的用户,解决了这个问题。 - Nicolas Modrzyk

3

这可能是由于一些第三方同步应用程序,例如Dropbox和坚果云等引起的。根据我的经验,可能有两种方法:

  1. 您可以尝试撤消最近的同步操作。
  2. 从文件夹中删除相关文件,提交,然后将文件移回。

我该如何找出哪些文件是相关的? git gc 没有给我更多信息。 - Tim Kuipers
我有Dropbox,它在某个地方弄乱了一些内部的.git文件,但我不知道是什么时候发生的,也与已提交的文件无关,而是与我的未提交更改有关。我只需要稍微修改一下我的文本/代码,使哈希值不同,就不会再触发错误了。 - Tim Kuipers

2

如果您并不关心文件的轨迹,可以采用简单的解决方法:复制文件并删除原始文件,先提交删除和添加操作,然后将文件重命名为原始名称。

这样Git应该就能正常构建了。


1
对我有用——谢谢abd,清空了文件夹,提交了更改,然后替换了文件并再次提交。 - David

1
git status 

然后它会显示哪些文件被修改/导致了问题... 然后您可以通过git add "文件名"(不带引号)添加它们 或通过git rm "文件名"删除它们


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接