【问题标题】:warning: remote HEAD refers to nonexistent ref, unable to checkout警告:远程 HEAD 引用不存在的 ref,无法结帐
【发布时间】:2012-08-10 00:00:15
【问题描述】:

这似乎是不同原因的常见错误。

我有一个简单的裸 git repo,名为“kiflea.git”,我像这样克隆它:

git clone git://kipdola.be/kiflea.git

然后 git 告诉我:warning: remote HEAD refers to nonexistent ref, unable to checkout.

是的,地图中没有版本控制文件,除了 .git 目录。 无论如何,我唯一需要做的就是:

cd kiflea
git checkout master

它有效,所有文件都在那里。 但是我认为克隆一个 repo 会自动检查 master,那么到底发生了什么,我该如何解决?

我注意到,在我执行git checkout master 位之后,它会被添加到我的本地 .git 配置文件中:

[branch "master"]
    remote = origin
    merge = refs/heads/master

知道这个 git 存储库在遥远的过去曾经是一个 svn 存储库,这可能很有趣。

Ps:使用 gitweb 浏览裸仓库时,明显有一个master 分支:http://kipdola.be/gitweb/?p=kiflea.git;a=summary

【问题讨论】:

  • git ls-remote origin 向您展示了什么?
  • checkout master位前后相同:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
  • 看起来远程存储库已丢失(或从未拥有)其HEAD。您可以直接访问它吗?如果是这样,请参阅here
  • 如果你克隆一个仓库并且没有指定分支,它会尝试使用远程头。如下面的答案所述,您不能直接影响哪个分支。但是,通过在克隆时签出不同的分支,您可以避免此检查。在您的情况下,似乎 master 存在,但远程头指向其他地方,因此请使用:git clone -b master <url> <dir>

标签: git


【解决方案1】:

warning: remote HEAD refers to nonexistent ref, unable to checkout. 表示远程(裸)存储库在名为 HEAD 的文件中包含 分支引用,其值与同一存储库中的任何已发布分支都不匹配。

请注意,警告仅表示 git 没有进行结帐。克隆的存储库在其他方面都很好。只需执行 git branch -a 以查看可能的分支,并执行 git checkout the-branch-you-want 以解决此问题。

这通常会发生,因为该文件的默认 contents.git/HEAD 或纯 HEAD 用于裸存储库)是 ref: refs/heads/master,这表示如果有人要去 clone 这个存储库,他们应该默认克隆分支refs/heads/master。默认情况下,Git 将创建不带 refs/heads/ 前缀的本地分支(即默认情况下为 master)。请尝试git help symbolic-ref 了解更多信息。

这种情况的问题是 Git 没有提供修改 remote 符号引用的方法,因此您要么使用 Git 托管服务提供商已经实现的东西(例如,设置 - 如果你有 GitHub 中的默认分支)管理员权限)或者您必须使用分支名称 master 作为默认分支(因为这是文件 HEAD 的默认内容,如果您无法修改该文件,您将永远被 master 卡住)。

如果您对远程 git 存储库具有 shell 访问权限,您可以简单地 cd path/to/git/repo; git symbolic-ref HEAD refs/heads/XYZ 其中XYZ 是您要默认使用的分支名称。

解决此问题的一种方法是创建一个没有提交的新远程裸存储库,然后执行 git push name-of-the-remote my-special-branch-name 这将导致裸存储库包含单个分支 my-special-branch-nameHEAD 符号引用仍包含默认值指向master 的值。结果,您将收到上述警告。如果您无法修改远程HEAD 文件,您可以使用语法git push name-of-the-remote my-special-branch-name:master 发布您的分支,这意味着您的本地分支my-special-branch-name 应该发布为远程分支master

【讨论】:

  • 请注意,警告仅表示 git 没有执行checkout。克隆的存储库在其他方面很好。使用git branch -a 来查看可能的分支,使用git checkout the-branch-you-want 来“修复”问题。
  • 在使用git clone -b master(或任何现有分支的名称)时,至少可以避免使用远程头。
  • 我已经完全按照你在上一段中写的那样做了;裸仓库(在 gitlab 内)的分支中有文件,但克隆似乎是空的。 {git branch -a} 什么也没显示。 {git clone -b my-special-branch-name } 似乎也不起作用(远端挂断)。
  • 我通过将 refs/remotes/my-special-branch-name 复制到 refs/heads 并编辑 HEAD 以匹配(在裸 gitlab 存储库中)来“修复”它。然后我可以使用 -b my-special-branch-name 成功克隆。但是,在“init”/“push”循环之后配置裸空 repo 以使 clone -b 不会遇到问题的正确方法是什么?
  • @EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZ 其中XYZ 是您希望使用的默认分支名称,如果git clone 在没有-b 标志的情况下完成。如果您还有其他问题,请提出新问题,而不是将问题添加为 cmets。
【解决方案2】:

我遇到了同样的问题,因为我不再使用 master 分支,它在我的本地和远程存储库中都丢失了。

远程存储库仍将HEAD 设置为master,我已将其更改为我实际使用的远程分支之一,一切正常。

如果您可以访问远程存储库:

  • 转到您的remote_repo.git
  • 编辑HEAD文件
  • ref: refs/heads/master 更改为ref: refs/heads/your_branch

【讨论】:

  • 这两种情况都是可能的,master 被删除并且 HEAD 仍然指向它,或者 HEAD 被更改为之后被删除的分支。我猜(因为 master 作品的结帐)第二个选项是我们的情况。 @MarcoBonifazi 在这种情况下,“更改”是用refs/heads/master 替换broken_branch
  • 是否有一种“正确”的方式来设置 HEAD 分支,而无需求助于编辑文件?
【解决方案3】:

是的,这与您的 git clone 尝试签出不同于 master 的分支有关。就这样做

git clone user@git-server:project_name.git -b branch_name /some/folder

这将帮助您通过其分支名称克隆确切的分支。

【讨论】:

    【解决方案4】:

    答案很晚(2021 年),但会帮助其他人。

    当您使用git init --bare 创建一个裸仓库时,它在HEAD 文件中设置了ref: refs/heads/master,但是当您克隆这个裸仓库时,它的默认分支是main,这就是问题所在,因此您需要更改HEAD文件并输入main' instead of masater`,即

    ref: refs/heads/main

    【讨论】:

    • 或者,使用git 命令执行相同操作:git symbolic-ref HEAD refs/heads/main
    【解决方案5】:

    即使显示了这个错误 - 我的项目仍然连接到相应的存储库 - 我运行了 git branch 命令并看到了相应的分支 - 然后我运行了 git checkout *branchname 和 BOOM - 一切都很好。

    【讨论】:

    • 是的,@Mikko 解释了原因。如果要跳过结帐,可以使用 -b 选项。 (但从长远来看,最好修复您的远程仓库!)
    【解决方案6】:

    我在创建裸仓库时遇到了同样的问题。

    我解决了这个问题,只是克隆了 repo,创建了一个本地 master 分支,然后将 master 推送到远程 repo。

    1) 克隆仓库

    $ git.exe clone --progress -v "the remote path" "my local path"
    

    2) 在本地创建一个 master 分支。

       $ git checkout -b master
    

    3) 在本地分支中提交一些东西

    $ git add readme.md 
    $ git commit –m “Added readme”
    

    4) 远程推送本地master

       $ git push origin master
    

    【讨论】:

      【解决方案7】:

      对于 Gitlab,即使它显示您在默认分支上(例如 master),您可能实际上并不在它上面,再次设置它来修复它,如下所示:

      1. 新建一个分支,可能是asd
      2. settings > repository > Default Branch,显示默认分支为master
      3. 设置为asd
      4. 将其设置回master
      5. 删除asd分支

      完成,现在你的默认分支是master

      【讨论】:

      • 这是最快的解决方案。我们也有很多,而且效果很好
      【解决方案8】:

      这个问题已有 10 年历史。我现在就是这样解决的:

      假设您正在使用 clone 命令克隆您的 repo,您​​将看到如下日志:

      git clone https://abcgit-repo.abccoolrepo

      克隆到 'abcgit404.sasasasmy 酷回购'... 远程:计数对象:198,完成远程:查找来源:100% (26/26) 接收对象:80% (176/219)ed 208 (delta 0)Receiving objects 接收对象:100% (219/219), 49.09 KiB | 163.00 千字节/秒, 完毕。警告:远程 HEAD 指的是不存在的 ref,无法 结帐。

      现在解决remote HEAD 引用不存在的ref,无法

      首先检查你的分支,你会看到这样的日志:

      1. git checkout remotes/origin/mainline

      HEAD 现在位于 xyz

      1. 查看当前分支前面有 * 的所有分支

      git 分支-a

      *(HEAD 在原点/主线分离)
      遥控器/原点/a
      遥控器/原点/b
      遥控器/原点/c
      遥控器/原点/d
      遥控器/来源/主线

      1. 从上面复制分支名称并运行 git checkout checkout -b

      例如检查主线:

      git checkout -b remotes/origin/mainline

      *来源/主线 遥控器/原点/a
      遥控器/原点/b
      遥控器/原点/c
      遥控器/原点/d
      遥控器/来源/主线

      这将解决问题

      【讨论】:

        【解决方案9】:

        您的远程存储库肯定有问题。您可以通过创建存储库的新克隆来修复它。也可以将新的提交推送到主分支。

        【讨论】:

        • 我猜你的意思是:“git push -u origin HEAD:HEAD”它没有为我解决任何问题......
        【解决方案10】:

        我猜它是提交日志中领先的*,它以某种方式欺骗了远程服务器。

        我可以使用一些菜单链接浏览 repo 的 Web 界面,但其他人会因为 404 - Unknown commit object 或类似内容而失败,尤其是从摘要页面。

        查看是否可以修改最后一条提交消息,然后强制推送更新以查看是否可以修复它。服务器恶魔中可能存在错误。如果它确实修复了它,那么值得在 git list git@vger.kernel.org 上报告(仅限纯文本消息)

        【讨论】:

          【解决方案11】:

          在我的情况下,回购是空的。

          git checkout --orphan master
          
          git add some_file
          git commit -m 'init'
          git push origin master 
          

          【讨论】:

            【解决方案12】:

            如果实际上没有可用的 master 分支,请检查以下内容; 如果 '.git' 文件夹中有一个名为 'packed-refs' 的文件,请打开它,您可以找到列出的所有引用。

            如下所示;

            # pack-refs with: peeled fully-peeled 
            e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
            ^cfae4f034e82591afdf4e5ed72279297d0eee618
            6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
            ^c32f7fa495d4b44652f46c065fcd19c3acd237a6
            72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
            ^50992e805e758e2231f28ec2127b57a1a9fd0ddc
            0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1
            

            然后使用;

            git checkout refs/tags/xxxx
            

            或者

            git checkout 'HASH value'
            

            检查所需的版本。谢谢。

            【讨论】:

              【解决方案13】:

              我似乎解决了这个问题:

              git checkout -b  master
              git push
              

              这创建了默认的 master,然后我可以检查我的其他分支

              【讨论】:

                猜你喜欢
                • 2010-12-29
                • 2017-05-07
                • 1970-01-01
                • 2012-01-14
                • 2016-12-27
                • 2018-01-30
                • 2020-01-16
                • 2017-05-28
                • 2019-03-13
                相关资源
                最近更新 更多