对于不同的原因,这似乎是一个流行的错误。
我有一个名为“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
答案 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
)上,您实际上也可能不在该分支上,请重新设置它以对其进行修复,例如:
asd
master
asd
master
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,无法
首先检查你的分支,你会看到这样的日志:
HEAD 现在在 xyz
git branch -a
<块引用>*(HEAD 在原点/主线分离)
遥控器/起源/a
遥控器/原点/b
遥控器/起源/ c
遥控器/原点/d
远程/原点/主线
例如检查主线:
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