Git: Correct way to change Active Branch in a bare repository?

git

Solution

If you have access to the remote bare repo, this article suggests:

git symbolic-ref HEAD refs/heads/mybranch

Which will update the HEAD file in your repository so that it contains:

ref: refs/heads/mybranch

as documented in the `git-symbolic-ref`

If you don't have access to the remote repo, see my previous answer.

Remember that a command like `git remote set-head`:

doesn't change the default branch of the remote repo. It only changes a remote tracking branch stored in your local repo as `refs/remotes/<name>/HEAD`

doesn't change `HEAD` itself (again, only `refs/remotes/<name>/HEAD`), hence the need for `git symbolic-ref`.

So `git remote set-head` is not the answer here. `git symbolic-ref HEAD` is, if you have direct access to the remote repo.

Problem

I have a bare repository that's used as the central store for my project. All the developers do `git clone <repo>` to share with it. When they do the clone, they get a checkout of the master branch (unless they do `git clone -n`) because `repo.git/HEAD` contains `ref: refs/heads/master`, making this the Active Branch. The question is, how do I change the Active Branch properly? I could simply hack the `repo.git/HEAD` file directly, but that seems nasty and, well, hacky. I tried doing `git checkout <otherbranch>` in the repo `.git` directory, but that failed because I wasn't in a work tree. I tried `git update-ref HEAD refs/heads/otherbranch` but that just updated refs/heads/master to be the same as refs/heads/otherbranch (okay, I did that one in a dummy repository, not my production one!) I tried `git update-ref --no-deref HEAD refs/heads/otherbranch` and that almost worked. It updated the `HEAD` file, but it set it to the SHA1 of the commit pointed to by `refs/heads/otherbranch`. I'm testing with git version `1.7.0.2.msysgit.0`. I'm guessing there's no way to do this through `git push`, as allowing all and sundry to change your default branch seems a bit unsafe (!), but surely there's a better way to do it in the repo `.git` directory than directly hacking the `HEAD` file.

Original source

Related problems