110

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

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

4

13 回答 13

165

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作为默认分支(因为这是文件的默认内容,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-name,但HEAD符号 ref 仍然包含指向master. 结果,您将收到上述警告。如果您无法修改远程HEAD文件,您可以使用语法发布您的分支,git push name-of-the-remote my-special-branch-name:master这意味着您的本地分支my-special-branch-name应该作为master远程分支发布。

于 2013-03-26T07:33:33.997 回答
14

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

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

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

  • 去你的remote_repo.git;
  • 编辑HEAD文件
  • 更改ref: refs/heads/masterref: refs/heads/your_branch
于 2014-02-19T10:26:51.200 回答
10

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

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

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

于 2014-07-15T16:18:20.320 回答
4

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

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

ref: refs/heads/main

于 2021-07-18T05:41:30.457 回答
3

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

于 2014-07-29T19:29:45.643 回答
2

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

我解决了它只是克隆了 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
于 2018-09-07T07:27:42.380 回答
2

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

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

git 克隆https://abcgit-repo.abccoolrepo

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

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

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

  1. git checkout remotes/origin/mainline

HEAD 现在在 xyz

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

git 分支 -a

*(HEAD 在 origin/mainline 分离)
remotes/origin/a
remotes/origin/b
remotes/origin/c
remotes/origin/d
remotes/origin/mainline

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

例如检查主线:

git checkout -b 遥控器/来源/主线

*origin/mainline 遥控器/origin/a
遥控器/origin/b
遥控器/origin/c
遥控器/origin/d
遥控器/origin/mainline

这将解决问题

于 2021-02-10T18:25:33.350 回答
1

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

于 2012-08-10T03:06:02.137 回答
1

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

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

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

于 2012-08-10T21:24:17.207 回答
1

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

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

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

于 2020-07-15T02:40:59.130 回答
0

如果实际上没有可用的 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'

签出所需的版本。谢谢你。

于 2018-05-15T03:31:01.973 回答
0

我似乎用以下方法解决了它:

git checkout -b  master
git push

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

于 2020-02-22T22:59:38.063 回答
0

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

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 
于 2020-06-09T09:03:18.793 回答