87

我不能提交更改:

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

4

13 回答 13

144

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

您只需要生成对象哈希:

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

有关详细信息,请参阅文档。在文档中,还有另一种修复此错误的方法。

PS这是对我有帮助的唯一方法。

于 2016-07-27T04:46:12.090 回答
21

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

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

您想要的文件位于:

/repo/.git/objects/13/da9eeff5a9150cf2135aaed4d2e337f97b8114
于 2013-01-22T07:40:10.623 回答
13

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

于 2013-01-21T22:27:30.763 回答
10

如果您的更改正在添加有问题的文件,您可以将其从索引中删除并再次添加:

git reset <file> 
git add <file>
于 2015-03-03T19:25:10.467 回答
7

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

于 2015-04-11T19:37:51.270 回答
5

就我而言,我通过以下方式解决了它:

git reset --mixed
于 2018-10-01T09:12:51.680 回答
3

这可能是Dropbox、建国云等第三方同步APP造成的。根据我的经验,可能有两种方法:

  1. 您可以尝试撤消最近的同步操作。
  2. 从文件夹中删除相关文件,提交,然后移回文件。
于 2017-10-19T10:20:59.993 回答
2

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

Git应该重新正常构建

于 2016-04-07T10:33:12.623 回答
0

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

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

然后一切恢复正常。

于 2015-12-16T07:41:09.967 回答
0

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

我在尝试使用 MinGW git 提交时开始遇到这个问题。切换回 Windows Git 解决了这个问题。

于 2018-09-17T01:24:29.500 回答
0

就像从远程仓库克隆到一个新文件夹一样简单,删除这个新文件夹中的所有文件,保留 .git 文件。然后将所有文件从旧文件夹复制到新的克隆文件夹而不复制 .git 文件夹..

于 2021-06-25T15:27:56.950 回答
0

好吧,我也遇到了这个问题,我所做的是:将更改的文件夹或文件复制到 VSCode 中的另一个项目并删除该存储库并再次克隆并再次传递该文件或文件夹。看起来很长,但我认为最好确保你不会丢失你尚未提交的文件

于 2021-10-05T20:50:58.630 回答
0

解决此问题的最简单方法是:

  1. 复制取消提交的文件。
  2. 然后使用$ git reflog -1
  3. 使用$ git reset --hard xxxxxx(xxxx 你的最后一个提交头)
  4. 然后再次粘贴您的文件。

它对我有用。无需克隆 repo 或删除遥控器。

于 2021-12-11T20:51:00.630 回答