warning: remote HEAD refers to nonexistent ref, unable to checkout
The warning: remote HEAD refers to nonexistent ref, unable to checkout.
means that the remote (bare) repository contains branch reference in the file called HEAD
with a value that does not match any published branch in the same repository.
Note that the warning only means that git didn't do checkout. The cloned repository is otherwise just fine. Just do git branch -a
to see possible branches and git checkout the-branch-you-want
to workaround the issue.
This usually happens because the default contents for that file (.git/HEAD
or plain HEAD
for bare repositories) is ref: refs/heads/master
which says that if somebody is going to clone
this repository, they should by default clone the branch refs/heads/master
. By default Git will create local branch without the refs/heads/
prefix (that is, master
by default). Try git help symbolic-ref
for more information.
The problem with this situation is that Git does not provide a method for modifying remote symbolic refs so either you use something the Git hosting provider has implemented (e.g. Settings - Default branch in GitHub if you have admin rights) or you have to use branch name master
as the default branch (because that's the default content for the file HEAD
and if you cannot modify that file, you'll be stuck with master
forever).
If you have a shell access to your remote git repo, you can simply cd path/to/git/repo; git symbolic-ref HEAD refs/heads/XYZ
where XYZ
is the branch name you want to use by default.
One way to hit this issue is to create a new remote bare repo with no commits and then do git push name-of-the-remote my-special-branch-name
which will result in bare repository containing a single branch my-special-branch-name
but the HEAD
symbolic ref still contains the default value pointing to master
. As a result, you'll get the aforementioned warning. If you cannot modify the remote HEAD
file, you can publish your branch using syntax git push name-of-the-remote my-special-branch-name:master
meaning that your local branch called my-special-branch-name
should be published as branch master
on the remote.
I have had the same issue because I was not using anymore the master
branch and it went lost in both my local and remote repository.
The remote repository had still the HEAD
set to master
, I have changed it to one of the remote branch I actually use and everything works fine.
If you can access your remote repository:
- Go to your
remote_repo.git
; - Edit
HEAD
file - Change
ref: refs/heads/master
toref: refs/heads/your_branch
Yes this is related to your git clone trying to checkout a branch different than master. Just do this
git clone user@git-server:project_name.git -b branch_name /some/folder
This will help you clone the exact branch via its branch name.
It is late(2021) answer but will help others.
When you create a bare repo using git init --bare
it set ref: refs/heads/master
in HEAD
file but when you clone this bare repo its default branch is main
, this is the issue so you need to change HEAD
file and put main' instead of
masater` i.e.
ref: refs/heads/main