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


611

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

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

除了获取存储库的新副本之外,还有什么方法可以解决此问题?


这是在克隆的存储库中还是在原始存储库中?clone命令是否输出任何错误?
CB Bailey

Answers:


1254

如果问题在于索引是提交的暂存区域(即.git/index),则可以简单地删除索引(如果需要,可以创建备份副本),然后在上一次提交中将索引恢复为版本:

在OSX / Linux上:

rm -f .git/index
git reset

在Windows上:

del .git\index
git reset

reset上面的命令与相同 git reset --mixed HEAD

您也可以使用较低级别的管道 git read-tree代替git reset


如果问题出packfile的索引上,则可以使用进行恢复git index-pack


27
我不小心:w!:Gstatus(来自fugitive.vim)中做了一个。这个答案节省了我很多头发。
劳伦斯·贡萨尔维斯

5
我知道我们不喜欢“我也”的消息,而是“我也”。与Windows等效erase /s .git\index,我也需要erase .git\index.lock
杰里米·麦基

1
嗨,我在查找和替换时遇到了同样的问题,但是git reset告诉我在.git / objects / pack /中有两个无法访问的打包文件。你有想法吗 ?
epsilones

13
git reset --keep代替使用会更安全吗?在Tower Git速查表中,解释为:将HEAD指针重置为先前的提交并保留未提交的本地更改
Pjetr 2013年

10
当我在写这个答案是不存在的......反正git reset --keep是更安全的形式git reset --hard; git reset --mixed完全不接触workdir。
雅库布·纳伦斯基(JakubNarębski)2013年

76

您可能在项目根目录上用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")

6
如果您不介意丢失中的更改.git/index,则可以随时将其删除并使用来重新创建git reset(不带--hard!)。
JakubNarębski2012年

1
我用#find破坏了它。/ -type f -exec sed -i's / Politician / Legislator / g'{} \; 按照这个答案的建议做,一开始并不会破坏它,但是被接受的答案修复了我所做的伤害。虽然这是很好的预防措施。
瑞安·莫滕森

1
@RyanMortensen您可以尝试sed使用类似以下的方法将您的内容反转,find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; 如果您.git/的腐败太严重而无法使用,则可能会有所帮助git reset。或者,也许您想还原现有内容.git/index而不删除它。当然,如果您的原始代码或索引中已经包含“立法者”,则此操作将失败。
滚刀

1
谢谢@hobs你救了我很多麻烦-我解决它通过颠倒sed通过更换我new_string用我的old_string
tsveti_iko

1
我重构了整个项目,而不是IntelliJ中的“ src”文件夹,并且遇到了这个问题。这解释了为什么我有这么奇怪的错误!
迈克尔

18

我遇到了这个问题,我尝试用以下方法修复:

rm -f .git/index
git reset

但是它没有用。解决办法?由于某种原因,我在子目录中还有其他.git文件夹。我git reset再次删除那些.git文件夹(不是主体)。删除它们后,一切都会恢复。


15

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

git fsck --full

8

由于上述解决方案给我带来了持续的问题,因此我使用了这种乏味的解决方案:

  1. 在其他地方克隆回购的新副本
  2. 将新鲜的.git目录复制到包含我要提交的更改的(破碎)存储库中

做到了。顺便说一句,sed正如@hobs猜测的那样,我在项目根目录上做了一个。吸取了我的教训。


那真是
太好了

如果您正处于合并过程中,自克隆以来创建了分支或发出了任何提交,或者存在许多其他情况,那真的不是很聪明……克隆存储库的新副本很难解决,我敢说有点不耐烦(最好捏一下)。实际诊断出正在发生的事情并修复现有的回购指数要好得多-通常相对容易做到。有时候,你可以重命名索引文件(或删除它,如果你确定你永远不会再需要它),并让Git的创建一个新的(使用Git复位或git的结帐)..
Jazimov

7

这对我有用。虽然我很好奇我最初开始出现错误的原因。当我昨天注销时,很好。不是今天早上登录。

rm .git/index

git reset

这对我有用,尽管它从git中删除了所有添加的文件。我必须为这些文件运行git add
Shamsul Arefin Sajib,

6

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


4

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


其他几个答案已经提供了此信息。
西蒙·佛斯伯格

-1

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


非常危险,因为它将删除未发布的提交,标签和分支以及存储和引用日志之类的数据。
科拉克多

不确定未发布的提交,因为我相信它们存储在.git文件夹中,并且我复制了.git文件夹。用这种方法我没有损失任何东西。我不知道关于存储和刷新的评论。
Astra Uvarova-土星的星

您是正确的,但也许您应该强调您做了本地克隆。但是我的评论家对于藏匿和重新引用仍然是正确的。
Koraktor

好的,我对该评论没有任何经验,但是,它对我有用,并且某些用户可能会觉得有用。无需投票。
Astra Uvarova-土星的星



-9

您也可以尝试还原到文件的先前版本(如果使用的是Windows os)


1
不要回答您不知道的问题。
Altaf Patel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.