之后git init
,我添加并提交了一些文件,进行了一些更改,添加并提交.设置git守护程序(在WinXP上的Cygwin下运行)并克隆一次存储库.现在,我在克隆的存储库中收到此错误:
$ git status error: bad index file sha1 signature fatal: index file corrupt
有没有办法解决这个问题,除了获取存储库的新副本?
如果问题是将索引作为提交的临时区域(即.git/index
),则可以简单地删除索引(如果需要,创建备份副本),然后在上次提交中将索引还原为版本:
在OSX/Linux上:
rm -f .git/index git reset
在Windows上:
del .git\index git reset
(reset
上面的命令是一样的 git reset --mixed HEAD
)
您也可以使用较低级别的管道 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")
我遇到了这个问题,我试着解决这个问题:
rm -f .git/index git reset
但它不起作用.解决方案?出于某种原因,我在子目录中有其他.git文件夹.我删除那些.git文件夹(不是主体)并git reset
再次删除.删除后,一切都恢复了.
这听起来像是一个糟糕的克隆.您可以尝试以下方法获取(可能?)更多信息:
git fsck --full
这对我有用.虽然我很好奇我最初开始得到错误的原因.我昨天退出时很好.今天早上登录,事实并非如此.
rm .git/index git reset
由于上述解决方案给我带来了持续的问题,因此我使用了这种乏味的解决方案:
在其他地方克隆回购的新副本
将新鲜的.git目录复制到包含我要提交的更改的(破碎)存储库中
做到了。顺便说一句,sed
正如@hobs猜测的那样,我在项目根目录上做了一个。吸取了我的教训。
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