François' Blog

The Default Git Branch

Published on 2020-06-17

For the eduVPN project I'm using two Git servers. My personal one, and GitHub as a mirror of those repositories.

For ages now we've had three branches: master, v1, and v2. All development currently happens in the v2 branch, and master is lagging behind a lot. On GitHub in the UI you can set the default branch to any other branch, but how to do that on your own Git server with cgit and how to actually delete the master branch?

Turns out this quite easy to do! On my personal Git server I have the repositories stored in /var/lib/git. The are in "bare" format there, obviously.

The repo.git directory contains a file HEAD with these contents:

ref: refs/heads/master

We can update this using the symbolic-ref Git command. How obscure?!

$ git symbolic-ref HEAD refs/heads/v2

The cool thing is that cgit picks this up automatically and uses that as the default branch from now on. Also when you clone the repository the v2 branch will be selected by default.

Next is deleting the master branch. Assuming the v2 branch at some point was created from the master branch you can easily delete master now. If you already have a cloned repository, you can also change the HEAD file in your checked out repository:

$ git symbolic-ref HEAD refs/heads/v2

Now you can delete master:

$ git branch -d master
$ git push origin :master