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

Num*_*er8 570 git corruption

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

$ git status
error: bad index file sha1 signature
fatal: index file corrupt
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ski 1164

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

在OSX/Linux上:

rm -f .git/index
git reset
Run Code Online (Sandbox Code Playgroud)

在Windows上:

del .git\index
git reset
Run Code Online (Sandbox Code Playgroud)

(reset上面的命令是一样的 git reset --mixed HEAD)

您也可以使用较低级别的管道 git read-tree而不是git reset.


如果问题与packfile的索引有关,则可以使用它来恢复它git index-pack.

  • 我不小心在`:Gstatus`(来自fugitive.vim)中做了一个`:w!`.这个答案为我节省了很多头发. (27认同)
  • 使用`git reset --keep`会不会更安全?在[Tower Git备忘单](http://www.git-tower.com/files/cheatsheet/Git_Cheat_Sheet_grey.pdf)中,它解释为:_Reset您的HEAD指针指向上一次提交并保留未提交的本地更改_ (13认同)
  • 当我写这个答案时它不存在......无论如何`git reset --keep`是更安全的形式**`git reset --hard`**; `git reset --mixed`根本不接触workdir. (9认同)
  • 我知道我们不喜欢"我也是"的消息 - 但"我也是".Windows中的等价物是`erase/s .git\index`,我也需要`erase .git\index.lock`. (5认同)

hob*_*obs 75

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

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果您不介意丢失`.git/index`中的更改,您可以随时删除它并使用`git reset`重新创建(不使用`--hard`!). (5认同)
  • 我用 # find ./ -type f -exec sed -i 's/Politician/Legislator/g' {} \; 打破了它 执行此答案建议的操作不会首先破坏它,但接受的答案修复了我所做的损坏。不过,这是极好的预防措施。 (2认同)
  • 谢谢@hobs,你为我省去了很多麻烦 - 我通过用我的 `old_string` 替换我的 `new_string` 来反转 `sed` 解决了这个问题! (2认同)

Cle*_*ida 15

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

rm -f .git/index
git reset
Run Code Online (Sandbox Code Playgroud)

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


Gav*_*Gav 13

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

git fsck --full
Run Code Online (Sandbox Code Playgroud)


小智 6

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

rm .git/index

git reset
Run Code Online (Sandbox Code Playgroud)


esk*_*ier 6

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

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

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


小智 5

当其中一个.git子目录下有一个目录时,可能会发生此问题。要修复它,请检查那里是否还有其他 .git 目录,然后删除它们并重试。


jen*_*ing 5

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