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


86

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

我有一个简单的裸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

而且,所有文件都在那里。但是我认为克隆存储库会自动检出主数据库,那么到底发生了什么,该如何解决呢?

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


2
是什么git ls-remote origin给你?
CB Bailey

checkout master在位之前或之后是相同的:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
skerit 2012年

1
看起来远程存储库丢失了(或从未丢失过)HEAD。您可以直接访问吗?如果是这样,请看这里
CB Bailey 2012年

1
如果克隆存储库但未指定分支,它将尝试使用远程头。如以下答案中所述,您不能直接影响哪个分支。但是,通过在克隆时检出另一个分支,可以避免此检查。在您的情况下,似乎主人存在,但远程头部指向其他地方,请使用:git clone -b master <url> <dir>
eckes

Answers:


125

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

请注意,警告仅表示git未进行签出。否则,克隆的存储库就可以了。只是git branch -a查看可能的分支并git checkout the-branch-you-want解决该问题。

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

这种情况的问题在于,Git不提供修改远程符号引用的方法,因此您可以使用Git托管提供程序已实现的功能(例如,如果您具有管理员权限,则可以使用GitHub中的默认分支-设置-)。master作为默认分支(因为这是该符号ref的默认值)。

如果您具有对远程git仓库的外壳访问权限,则可以简单地将默认情况下要使用的分支名称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符号ref仍包含指向的默认值master。结果,您将收到上述警告。


20
请注意,警告仅表示git没有这样做checkout。否则,克隆的存储库就可以了。不要git branch -a看到可能的分支,并git checkout the-branch-you-want以“修复”的问题。
Mikko Rantalainen

2
至少在使用时git clone -b master(或现有分支的名称),可以避免使用远程头。
eckes

我已经完全完成了您在上一段中所写的内容;裸仓库中的分支中有文件(位于gitlab中),但克隆似乎为空。{git branch -a}什么也不显示。{git clone -b my-special-branch-name <url>}似乎也不起作用(远端挂断了)。
Ed Randall

我通过将refs / remotes / my-special-branch-name复制到refs / heads并编辑HEAD进行匹配来“修复”它(在裸gitlab存储库中)。然后,我可以使用-b my-special-branch-name成功克隆。但是,在“ init” /“ push”循环之后配置裸机空存储库的正确方法是什么,以便克隆-b不会遇到问题?
Ed Randall 2015年

1
@EdRandallcd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZ其中XYZ是要在git clone没有-b标志的情况下使用的默认分支名称。如果您还有其他问题,请提出一个新问题,而不要添加问题作为注释。
Mikko Rantalainen 2015年

10

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

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

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

  • 去你的remote_repo.git;
  • 编辑HEAD档案
  • 更改ref: refs/heads/masterref: refs/heads/your_branch

两种情况都可能发生,master被删除,HEAD仍然指向它,或者HEAD被更改为后来被删除的分支。我猜(由于主节点的签出),第二种选择是我们的情况。@MarcoBonifazi在这种情况下,“更改”将替换broken_branchrefs/heads/master
eckes

2
有没有一种“适当的”方法来像这样设置HEAD分支而不求助于编辑文件?
Ed Randall

如我在另一条评论中所述,@ EdRandallcd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZ其中XYZ是要在git clone不带-b标志的情况下使用的默认分支名称。
米科·兰塔莱宁

7

是的,这与您的git克隆尝试签出不同于master的分支有关。做这个

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

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


2

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


是的,@ Mikko解释了原因是什么。如果要跳过结帐,可以使用-b选项。(但是从长远来看,最好修复远程
仓库

1

您的远程存储库肯定存在问题。您可能可以通过创建存储库的新副本来修复它。将新的提交推送到master分支也可能起作用。


我猜你的意思是:“ git push -u origin HEAD:HEAD”对我来说并没有解决任何问题……
RzR 2014年

1

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

我可以使用某些菜单链接浏览仓库的Web界面,但是其他菜单却失败404 - Unknown commit object或类似,尤其是在摘要页面中。

查看是否可以修改最后的提交消息,然后强制推送更新以查看是否可以解决此问题。服务器恶魔可能存在错误。如果能够解决问题,则值得在git列表git@vger.kernel.org上进行报告(仅纯文本消息)


1

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

我解决了它,只需克隆存储库,创建本地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

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'

签出所需的版本。谢谢。


0

我似乎用以下方法修复它:

git checkout -b  master
git push

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



0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.