警告:远程HEAD是指不存在的ref,无法结帐

时间:2012-08-10 00:00:15

标签: git

对于不同的原因,这似乎是一个流行的错误。

我有一个名为“kiflea.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

它有效,所有文件都在那里。 但我认为克隆一个repo会自动检出主人,所以究竟发生了什么,我该如何修复呢?

我注意到,在我执行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

13 个答案:

答案 0 :(得分:98)

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中的设置 - 默认分支)管理员权限)或者您必须使用分支名称master作为默认分支(因为这是该符号引用的默认值)。

如果您具有对远程git仓库的shell访问权限,则可以cd path/to/bare/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 symbolic ref仍包含指向master的默认值。因此,您将收到上述警告。

答案 1 :(得分:9)

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

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

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

  • 转到remote_repo.git;
  • 修改HEAD档案
  • ref: refs/heads/master更改为ref: refs/heads/your_branch

答案 2 :(得分:5)

是的,这与你的git clone试图检查不同于master的分支有关。就这样做

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

如果实际没有主分支,请检查以下内容; 如果'.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'

检查所需的版本。谢谢。

答案 7 :(得分:0)

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

我解决了它,只需克隆存储库,创建本地master分支,然后将master推送到远程存储库。

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)将本地主机推送到遥控器上

   $ git push origin master

答案 8 :(得分:0)

我似乎用以下方法解决了该问题:

git checkout -b  master
git push

这创建了默认的母版,然后我可以签出其他分支

答案 9 :(得分:0)

就我而言,回购是空的。

git checkout --orphan master

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

答案 10 :(得分:0)

对于Gitlab,即使它表明您位于默认分支(例如master)上,您实际上也可能不在该分支上,请重新设置它以对其进行修复,例如:

  1. 创建一个新分支,也许是asd
  2. 设置>存储库>默认分支,其中显示默认分支为master
  3. 将其设置为asd
  4. 将其重新设置为master
  5. 删除asd分支

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

答案 11 :(得分:0)

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

假设您使用 clone 命令克隆您的存储库,您将看到如下日志:

git clone https://abcgit-repo.abccoolrepo

<块引用>

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

现在解决远程HEAD指的是不存在的ref,无法

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

  1. git checkout remotes/origin/mainline
<块引用>

HEAD 现在在 xyz

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

git branch -a

<块引用>

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

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

例如检查主线:

git checkout -b remotes/origin/mainline

<块引用>

*起源/主线 遥控器/起源/a
遥控器/原点/b
遥控器/起源/ c
遥控器/原点/d
远程/原点/主线

这将解决问题

答案 12 :(得分:0)

回答晚了(2021 年),但会帮助其他人。

当您使用 git init --bare 创建裸仓库时,它会在 ref: refs/heads/master 文件中设置 HEAD,但是当您克隆此裸仓库时,其默认分支是 main,这就是问题所在所以你需要更改 HEAD 文件并将 main' instead of masater` ie

ref: refs/heads/main