【问题标题】:Git repository broken by interrupted commitGit 存储库因提交中断而损坏
【发布时间】:2018-09-26 07:54:20
【问题描述】:

我通过使用 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

【问题讨论】:

  • 这看起来是一个非常讨厌的问题,我在 +1 之前从未见过。

标签: git git-stash git-reflog git-fsck


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    中断 Git 并不是应该破坏存储库(Git 捕获键盘中断信号并优雅地处理它们),但此时,您需要弄清楚 .git/refs 发生了什么: p>

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 2015-04-09
      • 1970-01-01
      • 2010-12-05
      • 2012-01-06
      • 2019-11-10
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多