如何解决;错误:错误索引–;致命:索引文件损坏";使用Git时
在如何解决;错误:错误索引–;致命:索引文件损坏";使用Git时,git,corruption,Git,Corruption,在gitinit之后,我添加并提交了一些文件,做了一些更改,添加并提交了一些文件。设置git守护进程(在WinXP上的Cygwin下运行)并克隆一次存储库。 现在,我在克隆存储库中遇到以下错误: $ git status error: bad index file sha1 signature fatal: index file corrupt 除了获取存储库的新副本之外,还有什么方法可以修复此问题吗?这听起来像是一个糟糕的克隆。您可以尝试以下方法获取(可能?)更多信息: git fsck -
gitinit
之后,我添加并提交了一些文件,做了一些更改,添加并提交了一些文件。设置git守护进程(在WinXP上的Cygwin下运行)并克隆一次存储库。
现在,我在克隆存储库中遇到以下错误:
$ git status
error: bad index file sha1 signature
fatal: index file corrupt
除了获取存储库的新副本之外,还有什么方法可以修复此问题吗?这听起来像是一个糟糕的克隆。您可以尝试以下方法获取(可能?)更多信息:
git fsck --full
如果索引作为提交的暂存区(即
.git/index
)存在问题,您只需删除索引(如果需要,制作备份副本),然后将索引恢复到上次提交时的版本:
在OSX/Linux/Windows(使用Git-bash)上:
在Windows上(使用CMD而不是git bash):
(上面的reset
命令与git reset--mixed HEAD
相同)
您也可以使用较低级别的git读取树
,而不是git重置
如果问题出在的索引上,您可以使用
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")
您还可以尝试还原到文件的早期版本(如果您使用的是windows操作系统)我遇到了这个问题,我尝试修复此问题:
rm -f .git/index
git reset
但它没有起作用解决方案?
由于某些原因,我在子目录中有其他.git文件夹。我删除了那些.git文件夹(不是主体)并再次
git reset
。一旦它们被删除,一切都会恢复正常。当其中一个子目录下有.git
目录时,可能会出现此问题。若要修复它,请检查是否还有其他.git目录,然后删除它们并重试。这对我来说很有效。虽然我很好奇为什么我一开始就犯了错误。当我昨天注销时,一切都很好。今天早上登录,它不是
rm .git/index
git reset
由于上述解决方案给我留下了持续不断的问题,我使用了这个枯燥的解决方案:
成功了。顺便说一句,正如@hobs猜测的那样,我在项目根上做了一个
sed
。吸取了教训。这太荒谬了,但我刚刚重新启动了我的机器(mac),问题就这样消失了,好像从未发生过一样。我不想听起来像个支持者
rm -f .git/index
git reset
有关git子模块用户的更多信息,请参见注意:此处的解决方案不会按原样为您提供 例如,假设您有一个名为
dev
的父存储库,您的子模块存储库名为api
如果您在api
中,并且遇到了此问题中提到的错误:
错误:错误的索引文件sha1签名
致命:索引文件损坏
索引
文件将不在.git
文件夹内。事实上,.git
甚至不是一个文件夹-它将是一个文本文档,其中包含此存储库的真实.git数据的位置。可能是这样的:
~/dev/api$cat.git
gitdir:...git/modules/api
因此,您需要执行以下操作,而不是rm-f.git/index
:
rm-f../.git/modules/api/index
git重置
或者,更一般地说
rm-f../.git/modules/在此处插入您的报告名/索引
git重置
我做了一个简单的把戏。我将repo克隆到一个新文件夹。将.git文件夹从新文件夹复制到repo的旧文件夹,并在其中替换.git 现有的答案都不适合我
我使用的是worktrees,因此没有.git文件夹
你需要回到你的主要回购。其中,delete.git/worktrees//index
然后按照其他答案运行git reset。如果混合使用不同的
git
版本,回购可能会出现损坏
新git版本涉及的本地存储库与旧git版本不向后兼容。新的git回购看起来与旧的git版本相比已损坏(在我的例子中,git 2.28破坏了git 2.11的回购)
更新旧的git版本可能会解决这个问题。这是在克隆的存储库中,还是在原始存储库中?克隆命令是否输出任何错误?我意外地执行了一个
:w代码>在a中:Gstatus
(来自survious.vim)。这个答案让我省去了很多麻烦。我知道我们不喜欢“我也是”的信息,但是“我也是”。Windows中的等效项是erase/s.git\index
,我也需要一个erase.git\index.lock
。您好,我在查找和替换时遇到了同样的问题,但git reset告诉我.git/objects/pack/中有两个包文件无法访问。你有什么想法吗?使用git reset——保留不是更安全吗?在本文中,它被解释为:将头指针重置为以前的提交并保留未提交的本地更改在我编写此答案时不存在。。。无论如何,git reset--keep
是git reset--hard
的更安全的形式git reset--mixed
根本不涉及workdir。如果你不介意丢失.git/index
中的更改,你可以随时删除它,然后用git reset
重新创建(没有--hard
)。我用#find./-type f-exec sed-I's/political/legitor/g'{}打破了它;按照这个答案的建议去做,一开始不会破坏它,但被接受的答案修复了我所做的损坏。不过这是一个很好的预防措施。@RyanMortensen您可以尝试使用类似于find.git/-type f-exec-sed-i's/legiator/political/g'{}的东西来反转您的sed
代码>如果您的
rm .git/index
git reset
rm -f .git/index
git reset