Git 存储库因提交中断而损坏

Git repository broken by interrupted commit

我通过使用 Ctrl+C 中断 git commit 破坏了我的本地 git 存储库(两次提交背部)。 我该如何解决?

git stash 的输出:

$ git stash
fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

git fsck --lost-found 的输出:

$ git fsck --lost-found
notice: HEAD points to an unborn branch (Multi-Threading)
Checking object directories: 100% (256/256), done.
Checking objects: 100% (67/67), done.
error: refs/heads/Multi-Threading: invalid sha1 pointer 0000000000000000000000000000000000000000
dangling commit 2d5af11417b9508ece28c1bb1502e5299a2fa2d0
dangling commit 3b0dfd77c49c12a23469c036db7f45378a1bf740
dangling commit 47d212cf4c018b9f3544325a26c90f74d3323489
dangling commit 82674535931943f64b4a3475c14475591d84a318
dangling commit 83604cf338ccb0491081f7f27c2217bc11fba0c2
dangling blob a3133e60fe8fec7977270d1e93c0869e169024f1
dangling commit aae880196744421d1ffbf7dc23aa8965d4ee1f46
dangling blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
dangling commit f9558f1235c4a239b2c8d0677d2b1c31eb400836

git reflog 的输出:

$ git reflog
fatal: your current branch 'Multi-Threading' does not have any commits yet

写成.git/refs/heads/Multi-Threading也是不可能的:

$ echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading 
An error occurred while redirecting file '.git/refs/heads/Multi-Threading'
open: No such file or directory

中断 Git 不应该 破坏存储库(Git 捕获键盘中断信号并优雅地处理它们),但在这一点上,你需要弄清楚 .git/refs:

发生了什么
  • 它是否作为目录存在?
  • 它是否包含名为 packed-refs 的文件?如果是这样,请谨慎使用此文件的内容。如果没有,那可能没关系。
  • 是否包含子目录headsremotes、and/ortagsheads一个肯定存在,另外两个会在必要时创建。
  • 如果 .git/refs/heads/ 确实存在,为什么 尝试在其中创建名为 Multi-Threading 的文件时出现错误?

47d212cf4c018b9f3544325a26c90f74d3323489 放入名为 .git/refs/heads/Multi-Threading 的文件中确实看起来是一种正确的方法(尽管我不知道您为什么选择 47d212cf4c018b9f3544325a26c90f74d3323489 作为要使用的特定提交;请注意git fsck 显示的那些以某种随机顺序出现;但其中一个悬空提交可能是正确的)。

(packed-refs 文件(如果存在)包含已 packed 的引用值,以便占用单个文件而不是许多单独的文件。无论它的格式是 Git 喜欢的格式。请注意,创建 .git/refs/heads/<name> 文件将覆盖相应的 packed-refs 值。)

我的问题是由于系统错误。

我重启,重新执行echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading 没有错误,它解决了我的问题。