git初始化后,我添加并提交了一些文件,做了一些修改,添加并提交。设置git守护进程(在WinXP上的Cygwin下运行)并克隆一次存储库。 现在,我得到这个错误与克隆的存储库:

$ git status
error: bad index file sha1 signature
fatal: index file corrupt

除了获得一个新的存储库副本之外,还有什么方法可以修复这个问题吗?


当前回答

如果问题是索引作为提交的staging区域(即.git/index),你可以简单地删除索引(如果你想要备份副本),然后将索引恢复到上次提交的版本:

在OSX/Linux/Windows(与Git bash):

rm -f .git/index
git reset

在Windows上(使用CMD而不是git bash):

del .git\index
git reset

(上面的reset命令与git reset——mixed HEAD相同)

你也可以使用底层的git读树来代替git重置。


如果问题出在packfile的索引上,你可以使用git index-pack来恢复它。

其他回答

现有的答案都不适合我。

我使用的是工作树,所以没有。git文件夹。

你需要回到你的主回购。其中,删除。git/worktrees/<name_of_tree>/index

然后按照其他答案运行git reset。

我有同样的错误,并试图修复它所描述的接受的答案。然而,在重新设置.git/index中的索引后,它再次被损坏。

问题是,我昨天正在使用git bisect来查找一个bug,但忘记在一天结束时运行git bisect reset来清理。今天,当我开始进行更改时,git感到困惑,因为它仍然处于平分模式,而我正试图应用更改。我也不能只是运行git bisect reset,因为已经有变化了。

要解决这个问题,在根目录下的git bash中执行以下命令:

git stash -m <message>
git bisect reset        # You are now most likely in detached head mode
git checkout <branch>
git stash apply         # If you have multiple stashes, make sure 
                          to apply the correct one

注意,在这种情况下,不需要删除.git/index并重置索引!

git子模块用户注意——这里的解决方案不适合你。

例如,假设您有一个名为dev的父存储库,而子模块存储库名为api。

如果你在API内部,你得到了这个问题中提到的错误:

错误:错误的索引文件sha1签名 致命:索引文件损坏

索引文件不会在.git文件夹中。事实上,.git甚至不会是一个文件夹——它将是一个文本文档,其中包含这个存储库的真正。git数据的位置。可能是这样的:

好吧,滚出去 gitdir: - . git / modules /火

所以,你需要这样做,而不是rm -f .git/index:

Rm -f ../.git/modules/api/index git重置

或者,更一般地说,

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index . xml git重置

我也有这个问题,我试着用这个来解决:

rm -f .git/index
git reset

但这并没有起作用。解决方案? 出于某种原因,我在子目录中有其他。git文件夹。我删除了那些。git文件夹(不是主体),git重新设置。一旦它们被删除,一切又恢复正常了。

这听起来像是一个糟糕的克隆。你可以试试下面的方法来获取(可能吗?)更多信息:

git fsck --full