在 git init
之后,我添加并提交了一些文件,进行了一些更改,添加并提交了。设置 git 守护进程(在 WinXP 上的 Cygwin 下运行)并克隆存储库一次。现在,我在克隆的存储库中收到此错误:
$ git status
error: bad index file sha1 signature
fatal: index file corrupt
除了获取存储库的新副本之外,还有什么方法可以解决这个问题?
如果问题在于索引作为提交的暂存区(即.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
将其恢复。
您可能在项目根目录上使用 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 .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \;
的东西反转您的 sed
如果您的 .git/
损坏严重以至于 git reset
无法工作,这可能会有所帮助。或者,您可能想恢复现有的 .git/index
而不删除它。当然,如果您的原始代码或索引中已经包含一些“立法者”,这将失败。
old_string
替换我的 new_string
来反转 sed
解决了这个问题!
我遇到了这个问题,我尝试解决这个问题:
rm -f .git/index
git reset
但它没有用。 解决方案?出于某种原因,我在子目录中有其他 .git 文件夹。我再次删除了那些 .git 文件夹(不是主体)和 git reset
。一旦它们被删除,一切都会重新开始。
这听起来像是一个糟糕的克隆。您可以尝试以下方法来获取(可能?)更多信息:
git fsck --full
由于上述解决方案给我留下了持续的问题,我使用了这个沉闷的解决方案:
在其他地方克隆 repo 的新副本将新的 .git 目录复制到(损坏的)repo 中,其中包含我要提交的更改
成功了。顺便说一句,正如@hobs 猜测的那样,我在项目根目录上做了一个sed
。吸取了我的教训。
这对我有用。虽然我很好奇我首先开始收到错误的原因。当我昨天注销时,它很好。今天早上登录,不是。
rm .git/index
git reset
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
当其中一个子目录下有 .git
目录时,可能会出现此问题。要修复它,请检查那里是否有其他 .git 目录,然后删除它们并重试。
现有的答案都不适合我。
我使用的是工作树,所以没有 .git 文件夹。
你需要回到你的主仓库。在其中,删除 .git/worktrees/
然后按照其他答案运行 git reset 。
克隆远程 repo 并将 .git 文件夹从它替换到有问题的本地目录解决了这个问题。
如果您混合使用不同的 git
版本,存储库可能看起来已损坏。
新 git 版本涉及的本地存储库与旧 git 版本不向后兼容。新的 git 存储库看起来已损坏到旧的 git 版本(在我的情况下,git 2.28 破坏了 git 2.11 的存储库)。
更新旧的 git 版本可能会解决问题。
我做了一个简单的把戏。我将 repo 克隆到一个新文件夹。将 .git 文件夹从新文件夹复制到 repo 的旧文件夹,在那里替换 .git 。
rm -f .git/index
git reset
https://www.chris-shaw.com/blog/quick-fix-for-git-corrupt-index 上的更多信息
这很荒谬,但我刚刚重新启动了我的机器(mac),问题就消失了,就像它从未发生过一样。我讨厌听起来像一个支持的人...
您也可以尝试恢复到文件的先前版本(如果您使用的是 Windows 操作系统)
:Gstatus
中做了一个:w!
(来自 fugitive.vim)。这个答案为我节省了很多头发。erase /s .git\index
,我也需要一个erase .git\index.lock
。git reset --keep
不是更安全吗?在 Tower Git Cheat Sheet 中解释为:将您的 HEAD 指针重置为先前的提交并保留未提交的本地更改git reset --keep
是git reset --hard
的更安全形式;git reset --mixed
根本不触及工作目录。