修复 WSL2 下 Git 仓库文件损坏的问题

如果经常使用 WSL2 的时候不关闭虚拟机直接关机,会出现 Git 仓库文件损坏的情况,以下摘抄一个简单的解决方案:

一般索引损坏的表现是发现有一些索引文件是空的,然后 Git 命令找不到相关的引用,比如说如下的情况:

1
2
3
4
$ git status
error: object file .git/objects/82/3ab829ac51fdba3d0b219fdc7370480f193cdc is empty
error: object file .git/objects/82/3ab829ac51fdba3d0b219fdc7370480f193cdc is empty
fatal: loose object 823ab829ac51fdba3d0b219fdc7370480f193cdc (stored in .git/objects/82/3ab829ac51fdba3d0b219fdc7370480f193cdc) is corrupt

如果说只是单纯的 Git 索引损坏,可以直接将这些文件删除,然后重新从云端拉取最新的索引:

1
2
3
$ find .git/objects/ -type f -empty | xargs rm
$ git fetch -p
$ git fsck --full

如果在接取索引的时候遇到类似如下的错误,可以手动删除对应的文件,然后重新运行 git fetch

1
2
3
4
error: refs/remotes/origin/HEAD: invalid sha1 pointer 0000000000000000000000000000000000000000
error: refs/remotes/origin/master: invalid sha1 pointer 0000000000000000000000000000000000000000
error: bad ref for .git/logs/refs/remotes/origin/HEAD
error: bad ref for .git/logs/refs/remotes/origin/master