如何调试损坏的 Git 存储库

如何调试损坏的 Git 存储库

我有一个运行良好的 Git 存储库,直到突然出现:

$ git status
fatal: not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

.git 目录和所有文件仍然存在:

$ ls -l .git
total 48
drwxr-xr-x  2 nikratio nikratio     2 Jan 16  2016 branches/
-rw-rw-r--  1 nikratio nikratio   612 Jan 19 10:17 COMMIT_EDITMSG
-rw-rw-r--  1 nikratio nikratio   553 Nov 24  2019 config
-rw-r--r--  1 nikratio nikratio    73 Jan 16  2016 description
-rw-r--r--  1 nikratio nikratio   188 Feb 28 09:41 FETCH_HEAD
-rw-r--r--  1 nikratio nikratio 11876 Mar  7  2016 gitk.cache
-rw-rw-r--  1 nikratio nikratio    23 Feb 28 09:41 HEAD
drwxr-xr-x  2 nikratio nikratio    11 Jan 16  2016 hooks/
-rw-rw-r--  1 nikratio nikratio  2764 Feb 28 09:41 index
drwxr-xr-x  2 nikratio nikratio     4 Feb  1  2020 info/
drwxr-xr-x  3 nikratio nikratio     4 Feb  1  2020 logs/
drwxr-xr-x 41 nikratio nikratio    41 Feb 28 09:41 objects/
-rw-rw-r--  1 nikratio nikratio    41 Feb 28 09:41 ORIG_HEAD
-rw-rw-r--  1 nikratio nikratio  3321 Feb  1  2020 packed-refs
drwxr-xr-x  5 nikratio nikratio     5 Aug  6  2017 refs/
drwxrwxr-x  2 nikratio nikratio     5 Nov  3  2019 sequencer/

$ cat .git/HEAD
dfd4cba3856cea89037f1e8⏎                                     

我如何才能知道损坏的程度,以及到底是什么被损坏了?

答案1

这些数据看起来不正确:

$ cat .git/HEAD
dfd4cba3856cea89037f1e8⏎                                     

'HEAD' 是指向当前签出的提交的指针。如果您签出了分支提示,则此文件应包含ref: refs/heads/master(例如“主”分支)。您可以使用 更新它echo

(如果您已签出非提示提交或标签,则 HEAD 将直接包含该提交的十六进制哈希值 - 但是,对于当前正在使用的 SHA1 存储库,它将恰好是 40 位数字。您的看起来就像它应该是一个提交哈希,但是太短了。)

“ref:” 后面的 ref 名称也需要存在,要么作为实际文件(.git/refs/heads/master在此示例中),始终包含 40 位提交哈希,要么作为 中的一行.git/packed-refs

修复 .git/HEAD 后,请务必运行git fsck以验证存储库的剩余内容。我怀疑对象目录中可能还有更多文件损坏。

相关内容