使用 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 --keep
是git 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/
然后按照其他答案运行 git reset。
【讨论】:
【参考方案14】:如果您混合使用不同的 git
版本,repo 可能看起来已损坏。
新 git 版本涉及的本地存储库与旧 git 版本不向后兼容。新 git repos 看起来已损坏到旧 git 版本(在我的情况下,git 2.28 破坏了 git 2.11 的 repo)。
更新旧的 git 版本可能会解决问题。
【讨论】:
以上是关于使用 Git 时如何解决“错误:错误索引 – 致命:索引文件损坏”的主要内容,如果未能解决你的问题,请参考以下文章
Git 用git status命令时,不提示Your branch is up-to-date with 'origin/master'.信息,请问如何解决?