在git init之后,我添加并提交了一些文件,做了一些更改,添加并提交。设置git守护程序(在WinXP上的Cygwin下运行)并克隆存储库一次。 现在,我在克隆的存储库中遇到了这个错误:
git init
$ git status error: bad index file sha1 signature fatal: index file corrupt
除了获取存储库的新副本之外,还有其他方法可以解决这个问题吗?
这听起来像是一个糟糕的克隆。您可以尝试以下操作以获取(可能吗?)更多信息:
git fsck --full
如果问题是索引为提交的集结区(即.git/index),您可以简单地删除索引(如果需要,请制作备份副本),然后将索引恢复到上次提交的版本:
.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相同)
reset
git reset --mixed HEAD
您可以选择使用较低级别的管道git read-tree而不是git reset。
git read-tree
git reset
如果问题是包文件的索引,您可以使用git index-pack恢复它。
git index-pack
您可能在项目根目录上意外损坏了. git/index文件(可能是重构?),如下所示:
sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")
为了避免将来出现这种情况,只需使用grep/ses忽略二进制文件:
sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")
您还可以尝试恢复到以前版本的文件(如果您使用的是windows os)
我遇到了这个问题,我试着用这个来解决:
但它没有工作。的解决方案? 出于某种原因,我在子目录中有其他. git文件夹。我再次删除了那些. git文件夹(不是主体)和git reset。一旦它们被删除,一切都恢复正常。
当其中一个子目录下有一个.git目录时,可能会出现此问题。要修复它,请检查那里是否有其他. git目录,然后删除它们并重试。
.git
这对我很有效。虽然我很好奇为什么我一开始就收到错误。当我昨天注销时,它很好。今天早上登录,它不是。
rm .git/index git reset
由于上述解决方案给我留下了持续的问题,我使用了这个枯燥的解决方案:
做到了。顺便说一句,我在项目根目录上做了一个sed,就像@hobs猜到的那样。学到了我的教训。
sed
更多信息https://www.chris-shaw.com/blog/quick-fix-for-git-corrupt-index
git子模块用户注意-这里的解决方案不适合您。
例如,假设您有一个名为dev的父存储库,而您的子模块存储库名为api。
dev
api
如果你在api中,并且你得到了这个问题中提到的错误:
错误:错误的索引文件sha1签名 致命的:索引文件损坏
index文件不会在.git文件夹中。事实上,.git甚至不会是一个文件夹-它将是一个文本文档,其中包含该存储库的真实. git数据的位置。可能是这样的:
index
~/dev/api$cat. git//dev/api目录下的代码 gitdir: /.git/modules/api
所以,而不是rm -f .git/index,你需要这样做:
rm -f .git/index
rm-f… /.git/modules/api/index git重置
或者更一般地说,
rm-f… /.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git重置
我做了一个简单的技巧。我将repo克隆到一个新文件夹。将. git文件夹从新文件夹复制到repo的旧文件夹,替换那里的. git。
现有的答案都不适合我。
我使用的是工作树,所以没有. git文件夹。
你需要回到你的主存储库。在里面,删除. git/worktree//index
然后按照其他答案运行git重置。
如果您混合不同的git版本,存储库可能看起来已损坏。
git
新git版本触及的本地存储库与旧git版本不向后兼容。新的git存储库看起来已损坏到旧的git版本(在我的例子中,git 2.28损坏了git 2.11的存储库)。
更新旧的git版本可能会解决这个问题。
克隆远程存储库并将. git文件夹替换为有问题的本地目录解决了这个问题。
在Windows PowerShell上,它应该是
rm -Force .git/index git reset
我提交了我的更改,突然我的笔记本电脑由于电池问题而关闭,然后我得到了这个致命的索引损坏错误,桌面github无法找到这个git repo。所以我使用git-bash运行下面提到的命令,一切都恢复正常。
我遇到了同样的错误,并试图按照已接受的答案中的描述进行修复。然而,在.git/index中重置我的索引后,它立即再次损坏。
问题是,我昨天在使用git bisect查找bug,但忘记运行git bisect reset来清理之后在一天结束时。今天,当我开始进行更改时,git感到困惑,因为它是仍处于二分模式,我试图应用更改。我也不能只运行git bisect reset,因为已经有变化了。
git bisect
git bisect reset
要解决此问题,请在根目录的git bash中运行以下命令:
git stash -m <message> git bisect reset # You are now most likely in detached head mode git checkout <branch> git stash apply # If you have multiple stashes, make sure to apply the correct one
请注意,有无需删除.git/index并重置索引在这种情况下!