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

Posted

技术标签:

【中文标题】使用 Git 时如何解决“错误:错误索引 – 致命:索引文件损坏”【英文标题】:How to resolve "Error: bad index – Fatal: index file corrupt" when using Git 【发布时间】:2010-11-10 02:14:23 【问题描述】:

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

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

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

【问题讨论】:

这是在克隆的存储库中,还是在原始存储库中?克隆命令是否输出任何错误? 【参考方案1】:

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

git fsck --full

【讨论】:

【参考方案2】:

如果问题在于索引作为提交的暂存区(即.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一样)

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


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

【讨论】:

我不小心在:Gstatus 中做了一个:w!(来自fugitive.vim)。这个答案为我节省了很多头发。 我知道我们不喜欢“我也是”的信息——而是“我也是”。在 Windows 中等价于 erase /s .git\index,我也需要 erase .git\index.lock 嗨,我在查找和替换方面遇到了同样的问题,但 git reset 告诉我 .git/objects/pack/ 中有两个无法访问的包文件。你有什么想法吗? 使用git reset --keep 不是更安全吗?在Tower Git Cheat Sheet 中解释为:将您的 HEAD 指针重置为先前的提交并保留未提交的本地更改 当我写这个答案时它并不存在......无论如何git reset --keepgit reset --hard的更安全的形式; git reset --mixed 根本不接触工作目录。【参考方案3】:

您可能在项目根目录上使用 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!)。 我用 #find ./ -type f -exec sed -i 's/Politician/Legislator/g' \;做这个答案建议的事情并不会首先破坏它,但接受的答案修复了我所做的损害。不过,这是很好的预防措施。 @RyanMortensen 你可以尝试用类似find .git/ -type f -exec sed -i 's/Legislator/Politician/g' \; 的东西反转你的sed 如果你的.git/ 损坏到git reset 无法工作,这可能会有所帮助。或者您可能想恢复现有的.git/index 而不删除它。当然,如果您的原始代码或索引中已经包含一些“立法者”,这将失败。 谢谢@hobs,你为我省去了很多麻烦——我通过用我的old_string 替换我的new_string 来反转sed 解决了这个问题! 我重构了我的整个项目而不是 IntelliJ 中的“src”文件夹并遇到了这个问题。这就解释了为什么我会出现如此奇怪的错误!【参考方案4】:

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

【讨论】:

不要把你不知道的答案。【参考方案5】:

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

rm -f .git/index
git reset

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

【讨论】:

如果您在 vendor/ (e.x.) 中有一些 .git 文件夹,此答案确实可以解决问题 'rm' 不是内部或外部命令、可运行程序或批处理文件!!!!!!!!!!!!!!!【参考方案6】:

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

【讨论】:

其他几个答案已经提供了此信息。【参考方案7】:

这对我有用。虽然我很好奇我首先开始收到错误的原因。当我昨天注销时,它很好。今天早上登录,不是。

rm .git/index

git reset

【讨论】:

这对我有用,尽管它从 git 中删除了所有添加的文件。我不得不为这些文件运行 git add 'rm' 不是内部或外部命令、可运行程序或批处理文件!!!!!!!!!!!!!!!!!!【参考方案8】:

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

    在别处克隆一个新的 repo 副本 将新的 .git 目录复制到包含我要提交的更改的(损坏的)存储库中

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

【讨论】:

太棒了:) 如果您处于合并过程中,创建分支或在克隆后发布任何提交,或任何其他情况中的任何一个,这并不是很出色......回购几乎不是一个解决方案,我敢说它有点不耐烦(最好在真正紧要关头时离开)。实际诊断正在发生的事情并修复现有 repo 的索引要好得多——这通常相对容易做到。有时你可以重命名索引文件(或者删除它,如果你确定不再需要它)然后让 Git 创建一个新文件(使用 git-reset 或 git-checkout)..【参考方案9】:

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

【讨论】:

【参考方案10】:
rm -f .git/index
git reset

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

【讨论】:

其他几个答案已经提供了此信息。【参考方案11】:

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

【讨论】:

【参考方案12】:

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

【讨论】:

非常危险,因为它会删除未发布的提交、标签和分支以及存储和引用日志等数据。 不确定未发布的提交,因为我相信它们存储在 .git 文件夹中,我复制了 .git 文件夹。我没有用这种方法失去任何东西。我不知道 stashes 和 reflog 来制作任何 cmets。 你是对的,但也许你应该强调你做了一个本地克隆。但我的评论仍然适用于 stash 和 reflog。 好的,我对该评论没有任何进一步的经验,但是,它对我有用,一些用户可能会觉得它很有用。没有必要对它投反对票。【参考方案13】:

现有的答案都不适合我。

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

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

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

【讨论】:

【参考方案14】:

如果您混合使用不同的 git 版本,repo 可能看起来已损坏。

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

更新旧的 git 版本可能会解决问题。

【讨论】:

以上是关于使用 Git 时如何解决“错误:错误索引 – 致命:索引文件损坏”的主要内容,如果未能解决你的问题,请参考以下文章

git如何解决冲突?

Git 用git status命令时,不提示Your branch is up-to-date with 'origin/master'.信息,请问如何解决?

windows中使用Git如何解决文件冲突?

如何解决Git代码冲突问题?-Git实战-黑马程序员

解决Git推送时密码认证失败

如何解决与 git-svn 的冲突?