warning: remote HEAD refers to nonexistent ref, unable to checkout

git

Solution

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. In practice, that file defines which branch should be checked out by default after cloning the 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 open a shell on the remote matchine and execute `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.

Problem

This seems like a popular error for different causes. I've got a simple bare git repo called "kiflea.git", I clone it like this: ``` git clone git://kipdola.be/kiflea.git ``` Then git tells me: `warning: remote HEAD refers to nonexistent ref, unable to checkout.` And yes, there are no versioned files in the map, except for the .git directory. Anyway, the only thing I need to do is: ``` cd kiflea git checkout master ``` And it works, all the files are there. But I thought cloning a repo automatically checks out the master, so what is going on exactly, and how do I fix it? I have noticed that, after I do the `git checkout master` bit, this gets added to my local .git config file: ``` [branch "master"] remote = origin merge = refs/heads/master ``` It's probably interesting to know that this git repository used to be an svn repository in a distant past. Ps: when browsing the bare repository using gitweb, there clearly is a `master` branch there: http://kipdola.be/gitweb/?p=kiflea.git;a=summary

Original source

Related problems