如何使用Git解决“错误:错误索引 - 致命:索引文件损坏”

时间:2009-07-12 11:23:11

标签: git corruption

git init之后,我添加并提交了一些文件,进行了一些更改,添加并提交。设置git守护程序(在WinXP上的Cygwin下运行)并克隆一次存储库。 现在,我在克隆的存储库中收到此错误:

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

有没有办法解决这个问题,除了获取存储库的新副本?

15 个答案:

答案 0 :(得分:1102)

如果问题是索引为提交的暂存区域(即.git/index),您只需删除索引(如果需要,可以制作备份副本),然后将索引恢复到上次提交中的版本:

在OSX / Linux上:

rm -f .git/index
git reset

在Windows上:

del .git\index
git reset

(上面的reset命令与git reset --mixed HEAD

相同

您也可以使用较低级plumbing git read-tree代替git reset


如果问题出在packfile索引,则可以使用git index-pack恢复。

答案 1 :(得分:74)

您可能在项目根目录上使用sed(可能重构?)意外损坏了.git / index文件,其中包括:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")

为了避免将来出现这种情况,只需使用grep / sed忽略二进制文件:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")

答案 2 :(得分:12)

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

git fsck --full

答案 3 :(得分:10)

我遇到了这个问题,我试着解决这个问题:

rm -f .git/index
git reset

但它不起作用。 解决方案? 出于某种原因,我在子目录中有其他.git文件夹。我再次删除那些.git文件夹(不是主体)和git reset。一旦删除它们,一切都会再次起作用。

答案 4 :(得分:5)

这对我有用。虽然我很好奇我最初开始得到错误的原因。我昨天退出时很好。今天早上登录,事实并非如此。

rm .git/index

git reset

答案 5 :(得分:5)

由于上述解决方案给我留下了持续的问题,我使用了这个沉闷的解决方案:

  1. 在其他地方克隆新的repo副本
  2. 将新的.git目录复制到包含我想要提交的更改的(损坏的)repo中
  3. 诀窍。顺便说一句,我在项目根目录上做了sed @hobs猜测。学到了我的知识。

答案 6 :(得分:3)

请注意git子模块用户 - 此处的解决方案不适合您。

假设您有一个名为dev的父存储库,并且您的子模块存储库名为api

如果您在api内,并且您收到此问题中提及的错误:

error: bad index file sha1 signature fatal: index file corrupt

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

~/dev/api $ cat .git gitdir: ../.git/modules/api

因此,您需要执行此操作,而不是rm -f .git/index

rm -f ../.git/modules/api/index git reset

或者更一般地说,

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git reset

答案 7 :(得分:2)

当其中一个子目录下面有.git目录时,可能会发生此问题。要解决此问题,请检查其中是否存在其他.git目录,然后将其删除并重试。

答案 8 :(得分:0)

我遇到了同样的问题。在.git / index中重命名索引文件,然后git reset为我工作。

答案 9 :(得分:0)

现有答案中没有一个对我有用。

我正在使用工作树,因此没有.git文件夹。

您需要返回主仓库。在其中删除.git / worktrees / / index

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

答案 10 :(得分:0)

如果您混合使用不同的git版本,则回购似乎已损坏。

新git版本涉及的本地存储库与旧git版本不向后兼容。新的git仓库看起来已损坏到旧的git版本(在我的情况下git 2.28破坏了git 2.11的仓库)。

更新旧的git版本可以解决此问题。

答案 11 :(得分:-2)

rm -f .git/index
git reset

https://www.chris-shaw.com/blog/quick-fix-for-git-corrupt-index

的更多信息

答案 12 :(得分:-2)

我做了一个简单的把戏。我将存储库克隆到一个新文件夹。将.git文件夹从新文件夹复制到repo的旧文件夹,在那里替换.git。

答案 13 :(得分:-4)

这很荒谬,但我刚刚重新启动了我的机器(mac),问题就像从未发生过一样。我讨厌听起来像一个支持者...

答案 14 :(得分:-7)

您也可以尝试恢复到以前版本的文件(如果您使用的是Windows操作系统)