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


72

我无法进行更改:

$ 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 commit带回来,我愿意失去一点历史。


您确实有系统的备份,不是吗?你不能从中恢复吗?
乔纳森·莱夫勒

13
@JonathanLeffler,无论他做与否对解决git的答案都没有影响。
Paul Draper

Answers:


16

您的git储存库中可能有损坏的对象。

如果您有该存储库的远程副本或其他副本,则可以从那里获取有问题的文件,然后将其替换为本地存储库。

您想要的文件将位于:

/repo/.git/objects/13/da9eeff5a9150cf2135aaed4d2e337f97b8114

3
就我而言,引用的文件不再位于.git objects文件夹中!>。<
mix3d

恰好:您想在可能存在的回购的其他克隆中寻找它
FuzzyTew

由于I / O错误而发生了相同的问题。我无法替换该文件,但删除了整个文件夹(在示例中为/local/.git/objects/13/),然后从远程仓库中复制了该文件的副本。它成功了,一切都又恢复了!谢谢
西蒙

5
@AlexNikulin在下面的回答是一个更好的解决方案:git hash-object -w spec/routing/splits_routing_spec.rb
sagannotcarl

6
我对这个答案不满意,因为git hash-object -w效果更好(对我而言)。
Nikos Alexandris

111

此错误意味着您有一个带有hash的文件13da9eeff5a9150cf2135aaed4d2e337f97b8114,并且该哈希在中不存在.git/objects/../,或者为空。发生此错误时,我仅在错误中包含此哈希,而没有文件路径。然后我试图做git gc --autogit reset --hard。这些命令之一(这些命令不能解决我的问题)之后,我得到了触发错误的文件的路径。

您只需要生成对象哈希:

git hash-object -w spec/routing/splits_routing_spec.rb

有关更多信息,请参见文档。在文档中,还有一种其他方法可以修复此错误。

PS:这是对我有用的唯一方法。


2
太好了,谢谢你。避免了我的全部藏身之地。我更新了您的答案,以使用OP中的特定文件和路径。
约书亚·品特

1
我做到了,它奏效了,但是下次我尝试提交该错误时,错误仍然存​​在,有没有解决的办法?
NotSoShabby

@NotSoShabby可能是硬盘的问题。您的元文件已被某些进程或硬件问题损坏。
亚历克斯·尼克林

这很好,应该被接受的答案
Deepak Raj

13

git reset --hard 应该会使您的存储库恢复正常,但您将丢失未提交的更改。


8
$ git reset --hard给出致命信息:无法读取树2287adf1b2a974541ce5806abc23dbd79814d666
gorn 2013年


3
+1重置-为我辛苦了。我的问题是Google云端硬盘在多台计算机上同步我的本地代码-您必须记住停止并重新启动它以使其同步。我认为Google驱动器必须故意忽略监视.git目录引起的大量更改。
eduncan911 2014年

小心。使用此命令将放弃未提交的更改。
iplus26

8

如果您的更改要添加有问题的文件,则可以将其从索引中删除,然后再次添加:

git reset <file> 
git add <file>

2
如果您的磁盘驱动器中现在缺少该文件,则此方法无效。因为没有要重置的物理文件,您会收到一条fatal: ambiguous argument 'path/to/file.ext': unknown revision or path not in the working tree.消息
mix3d 2015年

6

对我来说,这只是权限问题。当我使用时sudo,它起作用了。也许与Mac环境有关


sudo有点太宽容,但确实是一个权限问题。通过将整个文件夹的所有权恢复给适当的用户来修复此问题。
Nicolas Modrzyk'3

3

就我而言,我通过以下方式解决了该问题:

git reset --mixed

2

这可能是由于某些第三方同步APP(例如Dropbox和Jianuoyun)引起的。根据我的经验,可能有两种方法:

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

1

解决方案简单易行,如果您不太关心文件的轨迹,可以复制文件并删除原始文件,先提交删除和添加,然后再次重命名为原始文件。

Git应该正常重新构建


1
为我工作-感谢Abd,清空文件夹,提交文件,然后替换文件并提交文件
David

0

就我而言,是远程分支中的文件已损坏。我通过以下方法解决了它:

  1. 通过以下方式完全删除远程分支 $ git remote rm origin
  2. 再次添加遥控器: $ git remote add origin <the-remote-url>
  3. 再次获取遥控器: $ git fetch origin
  4. 将hard重置为原点上所需的分支(例如develop):$ git reset --hard origin/develop

然后,一切恢复正常。


0

就我而言,这是由于git的版本不同。我一直通过git的官方Windows端口使用我的存储库,并开始使用具有相同版本号的MinGW端口。

尝试使用MinGW git时,我开始遇到此问题。切换回Windows Git解决了该问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.