【问题标题】:How to handle git gc fatal: bad object refs/remotes/origin/HEAD error?如何处理 git gc fatal: bad object refs/remotes/origin/HEAD 错误?
【发布时间】:2016-09-05 19:44:38
【问题描述】:

我今天在尝试运行 Git garbage collect 时随机碰到了这个问题:

$ git gc
fatal: bad object refs/remotes/origin/HEAD
error: failed to run repack

我该如何处理?

【问题讨论】:

    标签: git git-remote git-fetch git-gc


    【解决方案1】:

    我遇到此错误是因为默认分支已从 master 更改为 main。 我使用了上面一些答案给出的混合信息来解决它:

    cat .git/refs/remotes/origin/HEAD
    

    返回:

    ref: refs/remotes/origin/master
    

    为了修复它,我跑了:

    git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
    

    我再次运行它以仔细检查:

    cat .git/refs/remotes/origin/HEAD
    

    返回:

    ref: refs/remotes/origin/main
    

    然后git gcgit prune 工作正常。


    为了看看会发生什么,我也尝试了:

    git remote set-head origin --auto
    

    返回:

    origin/HEAD set to main
    

    它通过自动识别 ref 真正解决了问题。

    【讨论】:

      【解决方案2】:

      感谢上帝,我找到了这个 https://makandracards.com/chris-4/54101-fixing-a-git-repo

      fatal: bad object refs/remotes/origin/HEAD
      error: failed to run repack
      

      如果上游分支已被删除并且您的原点指向它,则可能会发生这种情况。您可以通过运行来确认这一点:

      cat .git/refs/remotes/origin/HEAD

      如果它指向一个不存在的分支,运行:

      git remote set-head origin --auto

      紧随其后

      git gc

      会解决的

      【讨论】:

        【解决方案3】:

        我的问题发生在一个特定的分支上。
        显然分支的参考文件已损坏。我就这样修好了。

        git checkout main
        // 我删除了文件 .git\refs\heads\branch_xpto
        git 拉
        git checkout branch_xpto

        【讨论】:

          【解决方案4】:
          git update-ref -d [wrong reference here]
          

          这将解决此问题。

          对于上述问题,请使用以下代码:

          git update-ref -d 'refs/remotes/origin/HEAD'
          

          如果您在使用 .git 时遇到如下错误:

          error: bad ref for .git/logs/refs/remotes/origin/Dec/session-dynatrace-logs 6
          

          您可以复制从 refs 开始的路径,如下所示:

          git update-ref -d 'refs/remotes/origin/Dec/session-dynatrace-logs 6'
          

          【讨论】:

          • 这修复了错误 cannot update the ref 'refs/remotes/origin/mybranch':无法为 '.git/logs/refs/remotes/origin/mybranch' 创建目录:没有这样的文件或目录
          • 这给了我error: refusing to update ref with bad name '.git/logs/HEAD 2'
          【解决方案5】:

          对我来说,造成这种情况的原因是在 Windows 的压缩文件夹中工作。当文件夹解压缩时,它损坏了包文件,引发了其他奇怪的问题,例如无法修剪不存在的分支。

          唯一的解决方法是清除工作目录并再次克隆 repo 遥控器。幸运的是,我仍然可以推送和拉取更新以确保没有丢失任何内容。现在一切都很好。

          【讨论】:

            【解决方案6】:

            看起来你的符号引用可能被破坏了...... 尝试将其替换为您的默认分支,如下所示: 例如,我的默认分支是 ma​​ster

            $ git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
            $ git fetch --prune
            $ git gc
            

            这应该可以解决它。

            【讨论】:

            • 我几乎做到了这一点,它奏效了。这是我实际运行的git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master; git fetch --prune; git prune; git gc;
            【解决方案7】:

            如果您正在使用 git worktrees,请确保您正在做一个

            git worktree prune
            

            运行前

            git gc
            

            我的工作树损坏了,这似乎在删除损坏的工作树后起到了作用。 git prune 本身似乎不起作用。

            【讨论】:

              【解决方案8】:

              我不明白这个的后果,但正如 in this thread 所建议的那样,当我遇到这个时,我就这样做了

              $ mv .git/refs/remotes/origin/HEAD /tmp
              

              (保留它以防万一)然后

              $ git gc
              

              无怨无悔地工作;我没有遇到任何问题。

              【讨论】:

              • 它对我有用,我想我遇到了这个问题,因为我将默认分支从 master 更改为另一个名为 develop 的分支。在我将其从 develop 改回 master 的前几天,我删除了旧的默认分支 develop,但在我的工作目录中,文件 .git/refs/remotes/origin/HEAD 仍然指向 refs/remotes/origin/develop不再存在。 在这种情况下删除文件确实有效。
              • git prune 为我工作,这是一种删除在 Git 中积累但未被任何有用引用的数据的方法。
              • 执行它们解决了我的问题:$ mv .git/refs/remotes/origin/HEAD /tmp$ git gcgit prune
              • 我怀疑最好的方法是@WilQu 的回答 (stackoverflow.com/a/49944297/660339)。谁能证实这一点?
              • 在我的情况下,git gc 显示了几个文件为fatal: bad object ...。我把他们每个人都搬到了/tmp。然后,git gc 工作,一切正常。
              【解决方案9】:

              看到特伦顿的回答后,我查看了我的.git/refs/remotes/origin/HEAD,发现它还指向一个现在已删除的旧分支。

              但我没有自己编辑文件,而是尝试了 Ryan 的解决方案:

              git remote set-head origin --auto
              

              它会自动将文件设置到新分支,然后git gc 工作正常。

              【讨论】:

              • 是的,这对我有用 - 因为我在完全相同的情况下。 git remote set-head $REMOTE --auto 在我的情况下,$REMOTE 是远程别名,而不是默认的“来源”,因为我设置了多个遥控器。
              • 这适用于我的 git 版本 2.33.0
              【解决方案10】:

              我遇到的问题(与上面this comment 中@Stavarengo 提到的问题相同)是默认远程分支(在我的情况下为develop)已被删除,但仍被@987654323 引用@。

              在我的编辑器中打开 .git/refs/remotes/origin/HEAD 显示如下:

              ref: refs/remotes/origin/develop
              

              仔细编辑它指向我的新默认分支,一切都很好:

              ref: refs/remotes/origin/master
              

              提示我的线索是运行 git prune 显示此错误:

              > git prune
              warning: symbolic ref is dangling: refs/remotes/origin/HEAD
              

              【讨论】:

              • 这也是我的解决方法
              • 这是我的确切解决方案。我们的团队最近也从使用默认分支 develop 更改为 master
              • 在此之后我必须运行 git gc 才能让一切恢复正常,但这修复了它!
              • 这也解决了我的问题 :)))) 非常感谢!
              猜你喜欢
              • 2021-03-29
              • 2017-12-07
              • 2018-01-30
              • 2013-09-25
              • 2011-02-08
              • 1970-01-01
              • 2021-02-05
              • 1970-01-01
              • 2018-12-25
              相关资源
              最近更新 更多