当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何使用Git解决"错误:错误索引-致命:索引文件损坏"》经验,为你挑选了7个好方法。

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

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

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



1> Jakub Narębs..:

如果问题是将索引作为提交的临时区域(即.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.


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

2> hobs..:

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


如果您不介意丢失`.git/index`中的更改,您可以随时删除它并使用`git reset`重新创建(不使用`--hard`!).

3> Cleiton Alme..:

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

rm -f .git/index
git reset

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



4> Gav..:

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

git fsck --full



5> 小智..:

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

rm .git/index

git reset



6> eskimwier..:

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

    在其他地方克隆回购的新副本

    将新鲜的.git目录复制到包含我要提交的更改的(破碎)存储库中

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



7> jenming..:

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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有