Git – Local Tracking Branches
Whenever I clone a new copy of the RHQ repository from git, I’m placed in a local tracking branch of master. However, I rarely (if ever) want to work directly in master. Instead, I want to work in one of the numerous features-branches we have for the project.
I could create local tracking branches for the lines of development I’m interested in following, but that would be tedious considering there are nearly 3 dozen to choose from these days. Not only that, but I would need to repeat those commands each time I clone the repository (which I sometimes do so I can work in two different branches simultaneously as opposed to using ‘git stash’ and flipping back and forth between them), not to mention that I’d need to repeat those commands on all machines I work with (my home desktop, my work desktop, and my work laptop).
So I figured I would automate this by writing a quick shell script that would interrogate git, gather the lists of remote branches, and create local tracking branches automatically. I wanted to write the script such that it would set up local tracking branches for any newly created remote branches since the last time the script was run. Also, to keep things simple, I wanted the name of my local tracking branches to mirror the names of the remote branches. With those things in mind, I came up with:
#!/bin/sh
if [[ $# -ne 1 ]]
then
echo "Usage: $0 "
exit 127
fi
cd $1
# get all remotes except HEAD
remotes=`git branch -r | grep -v HEAD`
locals=`git branch -l`
locals_tracked=0;
total_remotes=0;
for remote_branch in $remotes
do
let "total_remotes++"
# strip 'origin/' off of the remote_branch URL form
local_branch=${remote_branch##origin/}
already_had_local_branch=0
for existing_local_branch in $locals
do
if [[ $existing_local_branch == $local_branch ]]
then
already_had_local_branch=1
break
fi
done
if [[ $already_had_local_branch == 0 ]]
then
git branch --track $local_branch $remote_branch
let "locals_tracked++"
else
echo "Already had local branch '$local_branch'"
fi
done
echo "Found $total_remotes remote branches"
echo "Created $locals_tracked local tracking branches"
And here is how I use it. First, I clone the RHQ repository:
[joseph@marques-redhat] git clone ssh://git.fedorahosted.org/git/rhq/rhq.git rhq-repo
Next I run my script, passing as an argument the name of the directory I just created to store my local copy of the repository:
[joseph@marques-redhat] ./git-setup-locals.sh rhq-repo
The script will show you output along the lines of:
Branch agentPlugin set up to track remote branch agentPlugin from origin. ... Already had local branch 'master' ...
And finally print some summary information at the bottom:
Found 34 remote branches Created 33 local tracking branches
So what is this good for? Well, it enables me to quickly bounce around multiple lines of development with ease (using ‘git checkout <branch>’) and without having to worry about whether or not I have a local tracking branch setup for that feature-branch yet.
—–
In the grand schema of things, this single issue isn’t a huge win. However, if you’re not mindful of the little things, enough of them can add up over time and start to have a real effect on productivity. So I tend to automate these things sooner rather than later so that I can forget about them and more easily focus on the code itself or the business problem at hand.