【问题标题】:How to repair corrupt git repository - fatal: Not a git repository?如何修复损坏的 git 存储库 - 致命:不是 git 存储库?
【发布时间】:2022-02-09 05:55:32
【问题描述】:

我看了很多其他问题都没有用。

git reset --hardgit checkout branch 期间,我的笔记本电脑死机了。没有把握。硬重置后我看到了

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

我看到.git/index 是一个空文件。删除它不会产生任何结果。

任何想法如何恢复?我把我的大部分东西都推到了一个遥控器上,但我更喜欢保留我的树枝和藏匿处。我有一些有用的东西,即使我可以远程跟踪大部分内容,也很难。

【问题讨论】:

  • 您可以重新创建索引文件吗?删除它可能是一个错误。
  • 你见过this吗?
  • @tomerpacific,我想通了,看看我的回答。但是您的链接中有一条评论可能对“C. Kelly”有所帮助。

标签: git


【解决方案1】:

我想通了。我的.git/HEAD 文件也是空的。我已经在里面了

ref: refs/heads/master

然后我运行了(小心这些,以防您有未提交的更改,您可以先将修改后的文件安全地复制到其他地方)。

git reset --hard
git clean -f

我通过运行strace git status 发现了问题所在,并注意到它试图在目录路径中找到HEAD 文件。然后就很简单了。

附:事后我发现我试图做git reset --hard another_branch 的分支不见了。所以很明显,在进行重置时发生了问题。

【讨论】:

  • 缺少有效的.git/HEAD 文件将阻止 Git 将存储库识别为存储库,是的。还有其他几个条件可以做到这一点,例如缺少.git/objects 目录,但HEAD 文件是一个简单的文件,它相对容易被计算机崩溃损坏。 git reset --hard不应该损坏它;如果确实如此,则通常表明 Git 代码中存在错误,因为它应该找出出现问题并将旧的 HEAD 放回原处。
  • @torek,实际上可能是checkout。我假设HEADcheckout 期间被替换。因此,如果崩溃发生在它被截断时,那么它就不能用正确的数据写入。 WDYT?如果这听起来合理,我将编辑我的答案。
  • 结帐通常必须用新内容覆盖HEAD(例如用ref: refs/heads/br2 替换ref: refs/heads/br1)。 Git 倾向于使用“写入新文件,重命名到位”技术(尽管这里不是 100% 一致)。如果你被允许删除一个文件,但不能创建一个新文件,那就可以了,但这是一个奇怪的权限设置......
猜你喜欢
  • 2012-01-06
  • 2013-09-11
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多