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

gor*_*orn 61 git

我不能做出改变:

$ git commit
error: invalid object 100644 13da9eeff5a9150cf2135aaed4d2e337f97b8114 for 'spec/routing/splits_routing_spec.rb'
error: Error building trees
Run Code Online (Sandbox Code Playgroud)

我到目前为止尝试过:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114
Run Code Online (Sandbox Code Playgroud)

并且:

$ git prune
error: Could not read 1394dce6fd1ad15a70b2f2623509082007dc5b6c
fatal: bad tree object 1394dce6fd1ad15a70b2f2623509082007dc5b6c
Run Code Online (Sandbox Code Playgroud)

并且:

$ git fsck | grep 13da
missing blob 13da9eeff5a9150cf2135aaed4d2e337f97b8114
Run Code Online (Sandbox Code Playgroud)

但没有任何帮助.我应该删除文件,提交并重新引入吗?如果它带回git提交,我愿意失去一点历史.

Ale*_*lin 91

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

您只需要生成对象哈希:

git hash-object -w spec/routing/splits_routing_spec.rb
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅文档.在文档中,还有一种修复此错误的方法.

PS这是唯一对我有帮助的方式.

  • 太棒了,谢谢你.完全丢失了我的很多东西.我更新了您的答案,以使用OP中的特定文件和路径. (2认同)
  • 我这样做了并且它有效,但是下次我尝试提交时错误再次出现,有永久的解决方案吗? (2认同)

Lop*_*Sae 16

您的git存储库中可能有一个损坏的对象.

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

您想要的文件位于:

/repo/.git/objects/13/da9eeff5a9150cf2135aaed4d2e337f97b8114
Run Code Online (Sandbox Code Playgroud)

  • 以下@AlexNikulin的答案是一个更好的解决方案:`git hash-object -w spec/routing/splits_routing_spec.rb` (4认同)
  • 我赞成这个答案,因为`git hash-object -w`效果更好(对我而言). (4认同)
  • 在我的情况下,引用的文件不再在.git对象文件夹中!> < (2认同)

Pra*_*nav 14

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

\n
git hash-object -w <file-name-which-is-creating-problem>\n
Run Code Online (Sandbox Code Playgroud)\n

之后,git 将为哈希不匹配的文件创建 Sha1,并且其存储库将被修复。

\n

现在我可以使用git add *并且git commit -m没有任何问题。那\xe2\x80\x99就是它。

\n

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

\n


Tom*_*ald 13

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

  • $ git reset --hard赋予致命:无法读取树2287adf1b2a974541ce5806abc23dbd79814d666 (8认同)
  • +1重置--hard为我工作.我的问题是Google Drive在多台计算机上同步我的本地代码 - 您必须记住停止并重新启动它以使其同步.我认为谷歌驱动器必须故意忽略监控.git目录导致的质量变化. (3认同)
  • https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F可能会有所帮助. (2认同)

小智 8

如果您的更改添加了有问题的文件,您只需将其从索引中删除并再次添加:

git reset <file> 
git add <file>
Run Code Online (Sandbox Code Playgroud)

  • 如果文件现在从您的磁盘驱动器中丢失,这将不起作用;因为没有要重置的物理文件,您会收到“致命:模棱两可的参数 'path/to/file.ext':未知修订版或路径不在工作树中。”消息 (2认同)

Sat*_*u P 7

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

git reset --mixed
Run Code Online (Sandbox Code Playgroud)


lat*_*ian 5

对我来说这只是权限问题.当我使用'sudo'运行时,它有效.也许与mac environmnet有关