ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

C
Community

如果问题在于索引作为提交的暂存区(即.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 根本不触及工作目录。
h
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!)。
我用 # 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 而不删除它。当然,如果您的原始代码或索引中已经包含一些“立法者”,这将失败。
谢谢@hob,您为我省去了很多麻烦 - 我通过用我的 old_string 替换我的 new_string 来反转 sed 解决了这个问题!
我重构了我的整个项目而不是 IntelliJ 中的“src”文件夹并遇到了这个问题。这就解释了为什么我有这么奇怪的错误!
C
Cleiton Almeida

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

rm -f .git/index
git reset

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


如果您在 vendor/ 中有一些 .git 文件夹,这个答案确实可以解决问题(例如)
'rm' 不是内部或外部命令、可运行程序或批处理文件!!!!!!!!!!!!!!!
G
Gav

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

git fsck --full

e
eskimwier

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

在其他地方克隆 repo 的新副本将新的 .git 目录复制到(损坏的)repo 中,其中包含我要提交的更改

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


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

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

rm .git/index

git reset

这对我有用,尽管它从 git 中删除了所有添加的文件。我必须为这些文件运行 git add
'rm' 不是内部或外部命令、可运行程序或批处理文件!!!!!!!!!!!!!!!!!!
j
jenming

git submodule 用户注意 - 这里的解决方案不会按原样为您工作。

例如,假设您有一个名为 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


E
Eric Leschinski

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


其他几个答案已经提供了此信息。
A
Ash

现有的答案都不适合我。

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

你需要回到你的主仓库。在其中,删除 .git/worktrees//index

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


M
Moein Qureshi

克隆远程 repo 并将 .git 文件夹从它替换到有问题的本地目录解决了这个问题。


K
Kornel

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

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

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


A
Astra Uvarova - Saturn's star

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


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

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


其他几个答案已经提供了此信息。
H
Herman Leus

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


S
Shyamsundar

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


不知道的就不要回答了。