Not able to detect branch from Git post-receive hook
Asked Answered
I

5

17

I've got a post receive hook setup on the remote repo that tries to determine the branch name of the incoming push as follows:

$branch = `git rev-parse --abbrev-ref HEAD`

What i'm finding, though, is that no matter what branch I push from my $branch variable gets set with 'master'.

Any ideas?

Imposture answered 12/5, 2011 at 5:47 Comment(0)
B
26

The post-receive hook gets the same data as the pre-receive and not as arguments, but from stdin. The following is sent for all refs:

oldRev (space) newRev (space) refName (Line feed)

You could parse out the ref name with this bash script:

while read oldrev newrev ref
do
    echo "$ref"
done
Bend answered 12/5, 2011 at 10:40 Comment(2)
except beware if post-receive is receiving a git push --tags for example (and probably git push origin my_tagname) then the ref you'll be getting is refs/tags/my_tagname and not refs/branch/my_branchnameThelma
How can I switch to the previous commit, in post-receive hook?Toitoiboid
B
10

You could also do something like this using bash variable substitution:

read oldrev newrev ref

branchname=${ref#refs/heads/}

git checkout ${branchname}
Bergin answered 2/11, 2012 at 16:7 Comment(1)
Perfect, and then combine with @ralphtheninja's loop to read all when multiple branches are pushedBalanchine
M
2

Magnus' solution didnt work for me, but this did:

#!/bin/bash

echo "determining branch"

if ! [ -t 0 ]; then
  read -a ref
fi

IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"

if [ "master" == "$branch" ]; then
  echo 'master was pushed'
fi

if [ "staging" == "$branch" ]; then
  echo 'staging was pushed'
fi

echo "done"
Marlenemarler answered 11/9, 2012 at 10:48 Comment(2)
That's because you are looking for the word master, but what you received was refs/head/master. Using read you turned the string into an array delimited by '/'. Then you plucked out the value.Rriocard
Hi Can you help on how to add and condition in if like if ["master" == "$branch" && "development"=="$branch"]. How to use and condition in this if in hook. Advance thanks.Chemisorb
P
2

Both these answers are correct, but I was having trouble getting stdin to the next common function post-receive-email. Here is what I ended up with:

read oldrev newrev ref
echo "$oldrev" "$newrev" "$ref" | . /usr/share/git-core/contrib/hooks/post-receive-email


if [ "refs/heads/qa" == "$ref" ]; then
  # Big Tuna YO!
  wget -q -O - --connect-timeout=2 http://127.0.0.1:3000/hooks/build/qa_now
fi
Protozoology answered 19/10, 2012 at 18:20 Comment(0)
C
1

You need to read the arguments that are being passed to the script. That should have the branch name and new and old revisions and run for each branch pushed

Cottle answered 12/5, 2011 at 6:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.