【问题标题】:Git repository broken after computer died计算机死机后 Git 存储库损坏
【发布时间】:2021-08-11 17:48:28
【问题描述】:

我的电脑死机了,现在我的一个 git 存储库坏了。当我尝试结帐时它告诉我:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

当我执行git stash 时,我得到:

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

那么……我该怎么办?

更新 git reflog的输出:

fatal: bad default revision 'HEAD'

不是很有希望...git fsck 的输出:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

【问题讨论】:

  • 您能否检查.git/refs/heads/master 是否存在以及其内容是否是您的存储库的有效提交哈希(您可以检查,例如使用git show <hash>)?
  • 我知道这很明显,但仍然在问 - 你有同一个 git repo 的远程仓库吗?
  • @poke .git/refs/heads/master/的内容是一堆^@
  • @Tuxdude 是的,但没有更新到我的最新更改
  • git reflog 告诉你什么?你试过运行git fsck吗?

标签: git


【解决方案1】:

我设法恢复过来:

rm .git/refs/remotes/origin/HEAD
git fetch --all

【讨论】:

  • 在我的情况下,它发生是因为我删除了一些本地和远程分支(不知何故 .git/refs/remotes/origin/HEAD 文件仍处于不一致状态)。将上述文件的内容更改为指向现有的本地分支(例如 ref: refs/remotes/origin/master)解决了这个问题。不过,上述方法可能会更好,因为 HEAD 可能指向不在当前分支中的提交。
  • 如果问题发生在特定的 git 子模块上,第一个命令会稍微更改为 rm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
  • 我不得不做rm -rf .git/refs/remotes/origin,但你指出了我正确的方向
  • 就我而言,我删除了整个 "origin" 文件夹,因为没有 HEAD 文件。
【解决方案2】:

按照Recovering broken git repository中建议的步骤开始:

  • 检查.git/refs是否仍然包含有用的东西
  • 检查 git reflog 并检查 .git/logs/refs/heads/master 的内容或您上次所在的任何分支
  • 运行git fsck,可能使用--unreachable--lost-found

这有望让您弄清楚 master 引用应该是什么,以便您可以恢复它(即将正确的 SHA1 转换为 .git/refs/heads/master)。

如果该提交中包含的任何对象真正损坏,您将无法恢复您的HEAD 提交。假设您的工作树和/或索引完好无损,您可以尝试使用git reset --soft(或失败git reset)到上一次提交,然后重新提交。避免任何改变你的工作树的操作。 git checkout -fgit reset --hard

【讨论】:

  • 我看了.git/logs/refs/heads/mybranch。它显示了对该分支的某种提交历史。通过挖掘,我选择了 SHA 并尝试使用git show 显示它们。 (每个提交都有两个 SHA,我选择了第二个,就在作者姓名之前。)最后一个已损坏,但之前的一个可能是 git shown,然后我可以使用 git push origin abcdef:mybranch 推送它。跨度>
【解决方案3】:

在 Windows 8.1 蓝屏死机后,我遇到了类似的问题

我在这个位置有一个文件...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

它是空的,而这个文件夹中的其他分支文件里面有很长的字符串。

注意我没有任何更改/提交

  • 我备份了<problem-branch> 文件
  • 已删除文件
  • git fetch --all再次获取分支

然后选项卡自动完成再次开始工作

【讨论】:

    【解决方案4】:

    如果修改的文件不多,我觉得解决这个问题比较方便的方法是:

    1. 备份您在 repo 中修改的文件
    2. 删除您现有的存储库
    3. 从服务器重新克隆它
    4. 将步骤 1 中的文件粘贴到 repo,然后 git commit -a

    【讨论】:

    • 是的,没有人会想到重新克隆。很好的建议
    【解决方案5】:

    在计算冻结和崩溃后,我的 git 分支被以下消息损坏: git fatal: your current branch appears to be broken。我什么都做不了。

    在做git fsck 之后提到分支有一个error: Invalid HEADrefs/heads/<branch> 有一个 invalid sha1 pointer

    按照此处的选项,我在记事本++ 编辑器中打开了.git/refs/heads/<branch>,每个sha1 字符都是NUL

    幸运的是,我只需要将分支重置为远程状态,那是在 bitbucket 存储库中。我从远程 repo 的尖端抓取 sha1 并复制到 .git/refs/heads/<branch> 保存它,然后执行 git reset --hard HEAD,一切恢复正常。

    【讨论】:

    • 为我工作,谢谢
    【解决方案6】:

    我设法通过删除 git\refs\heads 目录中的主文件来解决这个问题

    【讨论】:

    • 这很有帮助,它从我的 intellij 列表中删除了该分支,我将其作为一个新分支进行了检查。幸运的是,我推送了我的更改,所以它们都在那里。
    【解决方案7】:

    由于无法锁定引用错误,我无法签出我的主分支。我最终删除了: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

    并调用这个 git 命令:

    git fetch --all
    

    【讨论】:

      【解决方案8】:

      我太白痴了,忘了推送,我的电脑在执行提交时崩溃了。 我可以通过打开来恢复除最后一次提交之外的所有内容 .git/logs/refs/heads/

      这个文件包含分支的所有提交(及其 SHA),我所做的恢复是:

      • 将最新更改备份到临时文件夹
      • 改用“白板”
        • git checkout master
        • git reset --hard
      • 检查日志中倒数第二个提交
      • 从这个分离的头部创建一个分支
      • 恢复最新更改
      • 再次提交

      所以即使你犯了一个愚蠢的错误,你也不会立即被一整天的 git 工作所吸引:)

      【讨论】:

        【解决方案9】:

        当 Android Studio 突然终止时(由于计算机断电),我遇到了同样的问题。

        我通过将我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\master 文件的内容复制到我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master 文件来解决它。

        (之前我也在 Android Studio 中打开了“强制推送”选项,但我认为这不是必要的步骤。)

        注意:

        我通过将我的C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\ 目录(包括子目录)中的文件内容与另一个healthy 项目中的相应文件(例如C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\)进行比较,找到了这个解决方案。

        您可能有另一个损坏的文件,但通过与另一个健康项目进行比较,您应该能够快速发现问题所在。

        如果您没有另一个配置了 git 的健康项目,则可能值得以与创建损坏项目相同的方式创建一个简单的项目,以便进行调查、比较和修复等。

        PS - 我的错误信息(已编辑)是:warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

        【讨论】:

          【解决方案10】:

          我知道这是一个为时已晚的响应,但我收到此错误是因为我没有 origin/head。您可以通过运行git branch -r 找到它。如果您没有看到您的origin/head 指向远程源,您可以通过运行git remote set-head origin {{your branch name}} 进行设置。

          现在再次运行git branch -r,您应该会看到如下内容: origin/HEAD -> origin/develop

          我希望这对遇到此问题的其他人有所帮助。

          【讨论】:

            【解决方案11】:

            我的电脑崩溃了两次,结果我的 git 存储库在本地被破坏了。我无法拉动我的更改,它要求设置远程来源,但它在 gitKraken 中不起作用。

            在我的命令提示符下,我收到了这个错误

            我知道我的参考资料已损坏,需要修复。我必须做的是 git bash (在 SourceTree 点击“终端”)。然后像这样导航到引用文件夹

            cd .git
            cd refs
            cd remotes
            cd origin
            

            那里会有一个文件名master,使用ls查看目录中有什么。然后只需使用删除它 rm大师

            bam,损坏的文件不见了。现在如果你发出 git branch 命令 -a,它会输出这个

            $ git branch -a
            * master
              remotes/origin/master (this in red color -scary :) )
            

            然后发出这个命令,它会修复你的引用

            $ git remote set-head origin master
            

            总而言之,如果你想拉遥控器,它应该显示空白的遥控器名称已修复。

            【讨论】:

              【解决方案12】:

              我有同样的问题,但没有运气,无法找出问题所在。 我把我的回购放在一边,从服务器重新克隆了一个,并试图在它们之间合并。当然,它显示了很多与我的分支无关的文件,但有助于隔离所需的文件。

              【讨论】:

                【解决方案13】:

                检查 MSWindows 是否创建了包含 git 的 desktop.ini 文件?它对我有用。一旦我将它们全部删除到 .git 目录的子文件夹中,它就可以工作了。

                【讨论】:

                  【解决方案14】:

                  如果我在某人之后重复,请原谅我(我还没有阅读所有反馈)。 在我看来,解决问题的最简单方法是复制没有 .git 和 .idea 的项目,清理它,从 git 克隆,删除除上述目录之外的所有内容,然后将以前的副本粘贴到带有 .git 和 .idea 的新创建的仓库中.希望它确实有意义。

                  【讨论】:

                    【解决方案15】:

                    由于我知道我的本地分支是最新的,因此快速解决方法是简单地将头部 SHA-1 复制到远程


                    我的可能原因:电源故障。

                    我收到了这个错误,但我还是可以推送更改。

                    我检查了文件.git/refs/remotes/<branch>,它包含所有null 字符。

                    但是,.git/refs/heads/<branch> 具有正确的 SHA1。

                    【讨论】:

                      【解决方案16】:

                      只需添加我的案例:

                      git push
                      

                      错误:无法锁定 ref 'refs/heads/master':无法解决 参考'refs/heads/master':参考损坏

                      我试过了:

                      git clone <path>
                      

                      但是得到了:

                      You appear to have cloned an empty repository.
                      

                      我在服务器存储库上检查了这个文件:

                      refs/heads/master

                      该文件有一个很长的空白字符字符串。

                      我用这个命令检查了最后一个提交标识符(幸运的是它仍然有效):

                      git log origin/master -5
                      

                      然后我将最后一个提交标识符复制到服务器文件 refs/heads/master

                      有风险,但它奏效了。克隆、推拉到现在都可以。

                      【讨论】:

                        【解决方案17】:

                        如果你记得你的头指向哪个分支,那么只需转到 github/bitbucket 上的那个分支并复制分支上最新提交的哈希并将其粘贴到文件 .git\refs\remotes\origin\HEAD 然后同样 混帐添加。 git 提交 -m "" git推送

                        【讨论】:

                          【解决方案18】:

                          面临类似问题(计算机紧急重启,可能是由于 Sourcetree 使用 Windows bugchecker re: KB4586853 导致内存泄漏/BSOD?)我从git fsck --full 得到以下信息:

                          error: refs/heads/merge/FEED-318: invalid sha1 pointer 0000000000000000000000000000000000000000
                          error: bad ref for .git/logs/HEAD
                          error: bad ref for .git/logs/refs/heads/<my-branch-name/with-subfolder>
                          

                          不确定是不是巧合,但我的分支被命名为 merge/TICKET-NO

                          在盲目尝试了许多这些解决方案后我找到了上一次提交的SHA(来自.git/logs/HEAD)并且只是--force检查了它,问题基本解决了。我所有的历史都回来了,能够gitk 看到漂亮的图表等。只是丢失了上次尝试提交的更改。

                          【讨论】:

                            【解决方案19】:

                            详细说明

                            报错信息“Broken head”是什么意思?

                            在解决问题之前,我们应该先了解错误信息。

                            错误信息说 HEAD 坏了!哪个头?头部表示我们当前的分支。该错误基本上意味着 CURRENT BRANCH 已损坏。

                            假设我们有 abbbcb 之类的分支,而当前分支是 ab 分支。

                            当我们运行此命令ls .git/refs/heads 时,我们将看到abbbcb,这些文件包含像392b55ccd3ba02fe236148c5264f8ef1da 这样的哈希值。

                            每当我们提交时,这个哈希值都会改变。

                            让我们回到错误消息“Head is broken”。

                            其实就是这个分支的hash值不合法!

                            如何重新生成这个错误(也许)?

                            第 1 步:在不提交的情况下进行大量更改。

                            第 2 步:在提交重大更改后仅 1 秒关闭计算机。

                            所以,git 无法更新新的哈希值,现在旧的哈希值失效了!

                            如何解决?

                            只需删除当前的哈希值!就这么简单!

                            ab 是我们当前的分支,这是我们的断头!

                            rm .git/refs/heads/ab 命令将删除包含无效哈希值的 ab 文件。

                            如果分支是远程分支,(之前被推送到仓库),那么我们应该git pull --allow-unrelated-histories --ff origin ab

                            如果分支是本地的,则继续提交。

                            解决了!

                            【讨论】:

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