最近遇到一个奇葩的问题,linux环境下,git add后不commit,然后把电脑挂起,出去吃个午饭,或者下班第二天来看,发现git已经无法使用了,提示为:Failed to resolve HEAD as a valid ref
根据错误提示说是信息头无法验证,要么是git出问题,要么是版本出问题。然后尝试git branch 查看分支,发现当前本地分支不见了,于是定位到git分支文件出问题了。
目前解决方法:
1、备份
任何时候,涉及到源码的问题都要记得备份,不然一旦出问题就悲剧了。
2、进入.git文件夹,运行git的一致性检查,排查问题所在git fsck --full (加上--full选项,则会展示所有未被其他对象引用的所有对象)
这时发现有一个错误信息:object file .git/objects/c3/d3cb0ac6a96fadc346aff560690526aba8da94 is empty
3、删除这个空文件,然后再运行git fsck --full并删除所有的空文件
find . -type f -empty -delete -print
4、用git reflog恢复数据,控制台提示头信息错误
fatal: bad object HEAD
5、去看主分支上最后的提交版本
tail -n 2 .git/logs/refs/heads/master
0000000000000000000000000000000000000000 3274b39b2cadfe128f047b618c8bf5a34c463a1a wangwei
1489029434 +0800 clone: from git@172.16.20.174:csgo2/dj-csgo.git
6、可以通过git show
3274b39b2cadfe128f047b618c8bf5a34c463a1a来查看版本信息
7、找到正确的版本后就还原该版本
git update-ref HEAD 3274b39b2cadfe128f047b618c8bf5a34c463a1a
8、版本数据还原后,还需要重构索引
rm .git/index删除当前索引文件
git reset重置索引
git fsck --full再次检查一致性
git status -s 检查当前项目文件与版本是否能够正确的对应
到此这个问题就完结了,具体为什么会出现这种情况暂时没有发现原因,解决方式也是很粗暴的重构还原。
如果你们有更好的解决方案或者知道产生原理的还请不吝赐教,非常感谢