警告: 远程 HEAD 引用不存在的引用,无法签出

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

我有一个叫做“ kifle.git”的简单的 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

成功了,所有的文件都在那里。 但我认为克隆一个回购自动检查主,所以究竟发生了什么,我如何修复它?

我已经注意到,在执行 git checkout master位之后,这将被添加到我的本地. git 配置文件:

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

了解这个 git 存储库在很久以前曾经是一个 svn 存储库可能是一件有趣的事情。

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

134106 次浏览

您的远程存储库肯定有问题。您可以通过对存储库进行新的克隆来修复它。另外,向主分支推送一个新的提交也可能有效。

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

我可以浏览回购的网页界面使用一些菜单链接,但其他失败与 404 - Unknown commit object或类似,特别是从摘要页面。

看看是否可以修改最后一个提交消息,然后强制推送更新,以查看是否修复了它。服务器恶魔里可能有个漏洞。如果修复了这个问题,那么就值得在 git 列表 git@vger. kernel.org 上进行报告(仅限纯文本消息)

warning: remote HEAD refers to nonexistent ref, unable to checkout.意味着远程(裸)存储库在名为 HEAD的文件中包含 分行参考文献,其值与同一存储库中的任何已发布分支都不匹配。实际上,在克隆存储库之后,默认情况下应该签出定义 哪个分支的文件。

注意,这个警告只意味着 git 没有执行签出。除此之外,克隆的存储库也不错。只需执行 git branch -a查看可能的分支和 git checkout the-branch-you-want解决这个问题。

这种情况经常发生,因为该文件的默认 内容(裸存储库的 .git/HEAD或普通 HEAD)是 ref: refs/heads/master,它表示如果有人要访问 clone这个存储库,他们应该在默认情况下克隆分支 refs/heads/master。默认情况下,Git 将创建没有 refs/heads/前缀的本地分支(默认情况下是 master)。请尝试 git help symbolic-ref获取更多信息。

这种情况的问题是,Git 没有提供修改 遥控器符号引用的方法,所以你要么使用 Git 托管提供商已经实现的东西(例如,如果你有管理员权限的话,GitHub 中的 Settings-Default 分支) ,要么必须使用分支名称 master作为默认分支(因为这是文件 HEAD的默认内容,如果你不能修改这个文件,你将永远只能使用 master)。

如果您对您的远程 git repo 有 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-name的裸存储库,但是 HEAD符号 ref 仍然包含指向 master的默认值。因此,你会得到上述警告。如果不能修改远程 HEAD文件,则可以使用语法 git push name-of-the-remote my-special-branch-name:master发布分支,这意味着称为 my-special-branch-name的本地分支应作为远程分支 master发布。

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

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

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

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

是的,这与您的 git 克隆尝试检出与 master 不同的分支有关

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

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

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

如果实际上没有可用的主分支,请检查以下内容; 如果在“ . git”文件夹中有一个名为“ pack-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'

检查所需的版本。谢谢。

我在创建裸回购时也遇到了同样的问题。

我只是克隆了回购,创建了一个本地的主分支,然后把主推到远程回购。

1)复制回购协议

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

2)在本地创建主分支。

   $ git checkout -b master

3)在本地分支中提交某些内容

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

4)在遥控器上按本地主机

   $ git push origin master

我好像是用:

git checkout -b  master
git push

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

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

git checkout --orphan master


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

对于 Gitlab,即使它显示你在一个默认的分支(例如 master) ,你可能实际上不在它上面,重新设置它修复它,像这样:

  1. 创建一个新的分支,可能是 asd
  2. 设置 > 存储库 > 默认分支,它显示默认分支是 master
  3. 调到 asd
  4. 调回 master
  5. 删除 asd分支

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

这个问题有10年了,我现在是这样解决的:

假设您正在使用克隆命令克隆回购,那么您将看到如下日志:

基因克隆 https://abcgit-repo.abccoolrepo

克隆成 “回收我的货物”。 Remote: Counting object: 198,done remote: Find source: 100% 远程: 计数对象: 198,完成远程: 查找源: 100% (26/26)接收对象: 80% (176/219)和208(delta 0)接收 接收对象: 100% (219/219) ,49.09 KiB | 163.00 KiB/s, 警告: 远程 HEAD 引用不存在的引用,无法 退房。

现在来解 远程 HEAD 是指不存在的引用,无法

首先检查您的分支,您将看到如下日志:

  1. Git 签出远程/原点/主线

头现在在某一点

  1. 看到所有的分支,你当前的分支将有 * 在它的前面

Git Branch-a

* (头部从原点/主线分离)
遥控器/原点/a
远端/原产地/b
遥控器/原点/c
遥控器/原点/d
远端/原点/干线

  1. 从上面复制分支名称并运行 Git 结帐结帐

例如:

Git checkout-b 远程/原点/主线

* 原产地/主线 遥控器/原点/a
远端/原产地/b
遥控器/原点/c
遥控器/原点/d
远端/原点/干线

这样问题就解决了

这是迟来的(2021)答案,但会帮助别人。

快速修复运行这个 git 命令 git symbolic-ref HEAD refs/heads/main

谢谢@alexey-vazhnov

当你使用 git init --bare创建一个裸回购时,它在 HEAD文件中设置了 ref: refs/heads/master,但是当你克隆这个裸回购时,它的默认分支是 main,这就是问题所在,所以你需要更改 HEAD文件并放入 main' instead of masater‘ i.e。

ref: refs/heads/main