如何解决;错误:错误索引–;致命:索引文件损坏";使用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

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

  • 在别处克隆回购协议的新副本
  • 将fresh.git目录复制到包含我想要提交的更改的(断开的)repo中

  • 成功了。顺便说一句,正如@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