How to get the name of the current git branch into a variable in a shell script?

Ben picture Ben · Jan 21, 2010 · Viewed 55.9k times · Source

I am new to shell scripting and can't figure this out. If you are unfamiliar, the command git branch returns something like

* develop
  master

, where the asterisk marks the currently checked out branch. When I run the following in the terminal:

git branch | grep "*"

I get:

* develop

as expected.

However, when I run

test=$(git branch | grep "*")

or

test=`git branch | grep "*"`

And then

echo $test

, the result is just a list of files in the directory. How do we make the value of test="* develop"?

Then the next step (once we get "* develop" into a variable called test), is to get the substring. Would that just be the following?

currentBranch=${test:2} 

I was playing around with that substring function and I got "bad substitution" errors a lot and don't know why.

Answer

wich picture wich · Jan 21, 2010

The * is expanded, what you can do is use sed instead of grep and get the name of the branch immediately:

branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')

And a version using git symbolic-ref, as suggested by Noufal Ibrahim

branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

To elaborate on the expansion, (as marco already did,) the expansion happens in the echo, when you do echo $test with $test containing "* master" then the * is expanded according to the normal expansion rules. To suppress this one would have to quote the variable, as shown by marco: echo "$test". Alternatively, if you get rid of the asterisk before you echo it, all will be fine, e.g. echo ${test:2} will just echo "master". Alternatively you could assign it anew as you already proposed:

branch=${test:2}
echo $branch

This will echo "master", like you wanted.