损坏的git树?

8

我在本地机器上的git仓库遇到了大问题。

我修改了一个文件,运行了git status,文件显示为已修改。我使用git add .添加了该文件,这和往常一样。但当我要提交更改时,出现了以下错误:

error: garbage at end of loose object 'e91ce852822d32e380ed7ddd04c93066e3c600ea'
fatal: object e91ce852822d32e380ed7ddd04c93066e3c600ea is corrupted

通过运行git cat-file -t e91ce852822d32e380ed7ddd04c93066e3c600ea,我可以看到这个对象是一棵树。
我看到了几种解决方案,用于修复损坏的blob或提交,但这是一棵树,我找不到关于出了什么问题或如何修复它的答案。
任何帮助都将不胜感激 :)

2
你运行过 git fsck 吗? - Mark Rushakoff
是的,同样的错误。 然而它是另一个对象,也是一棵树。 - Olof Johansson
@MarkRushakoff:刚刚遇到了与Olof相同的错误,而 git fsck 只是输出了相同的错误消息。 - Nicolas Raoul
3个回答

5
如果您的git仓库与外部资源(Github)同步,并且任何解决方案都无效,您可以重新初始化您的仓库。
我所做的是:
# copy the corrupted .git dir
mv -f .git .gitback
git init
# keep your config file
cp .gitback/config .git/config
# load objects
git pull

它有效了。显然,这不是一个很好的解决方案,但它可以帮助。


有时候,这就是你所能做的。虽然不是一个好的解决方案,但在独立项目中还是可以接受的 :) - James Adam

2
可能出了什么问题很难说,这取决于你的Git版本和环境。
例如,在旧版本中,由于legacyheaders = false设置,会触发git1.5.1的zlib问题,导致出现这种消息。

至于从loose objects恢复树,这个SO答案 "如何通过硬盘故障恢复Git对象" 说明了一种方法,在执行git fsck --full(正如Mark Rushakoff在评论中提到的)之后进行。

git cat-file -t 6c8cae4994b5ec7891ccb1527d30634997a978ee

并检查对象的类型。如果类型是树:您可以使用“git ls-tree”从先前的备份中恢复树;然后使用“git mktree”将其再次写入当前存储库。但这假设在旧的包或存储库备份中找到这些对象。

我也遇到了这个问题,但是.git/objects/pack/是空的。如何搜索旧的pack? - Olof Johansson
没错。我遇到了与问题描述相同的错误。这个错误也发生在同一硬盘上的其他存储库中。也许磁盘某些方面已经损坏了? - Olof Johansson
尝试了不同的备份,来回尝试了几次,但仍然没有成功。我已经删除了存储库并重新开始了。虽然很糟糕,但似乎没有其他办法...还是谢谢你们的帮助! - Olof Johansson
@Olof:很抱歉听到这个消息。我猜新的代码库到目前为止还没有出现同样的问题吧? - VonC
1
没有,目前为止还没有。但我认为问题是因为它位于共享网络文件夹上才发生的。虽然我不太了解git和共享文件夹,但这是我能想到的唯一可能原因。我们很快(希望)将改变工作流程,包括使用本地开发服务器,这样就可以摆脱共享文件夹的问题了。 - Olof Johansson
显示剩余6条评论

-2

早上好,就我而言,我刚刚删除了git目录,并重新初始化了git。


你的意思是要删除.git目录吗?那么...我猜不是要运行git init吧? - Nicolas Raoul

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