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

Viewed 69392

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.

7 Answers

To change the branch you need to change HEAD reference to the branch you want to use.

First list all the references in the bare repository by doing

$find ref

Then find the reference for your branch, the format will be as follows refs/heads/<my_branch>. So next step is to check current reference, just type:

$git symbolic-ref HEAD

so you know which is the current branch then update it as needed.

$git symbolic-ref HEAD refs/heads/<my_branch>

That's it. Enjoy.

How to change the Active Branch properly ?

  • status: git checkout in the repo .git directory returns fatal: This operation must be run in a work tree

  • tips: just add the --work-tree argument

detailed example : assumptions: bare git on remote server:

~/bare_git_repository.git detached work tree: /var/www/myappremote

on local server: create branch version.1.7 (our otherbranch)

git branch version.1.7

git push origin version.1.7

on the remote server with git bare repo:

$ cd ~/bare_git_repository.git

$ git branch

  • master
    version.1.7

As stated,following command

git checkout version.1.7

return

fatal: This operation must be run in a work tree

Using the following command

git --work-tree=/var/www/myappremote checkout version.1.7

successfully change the Active Branch propely

$ git branch

master

  • version.1.7

check the results with the following

ll /var/www/myappremote

hope it will help

At least at v.2.35.3, git symbolic-ref HEAD refs/heads/otherbranch no longer results in a file refs/heads/otherbranch. Instead it is silently added to .packed-refs and if there are no commits, to HEAD.git symbolic-ref HEAD will report silently from all.

See git help pack-refs

Related