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?
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
You could also do something like this using bash variable substitution:
read oldrev newrev ref
branchname=${ref#refs/heads/}
git checkout ${branchname}
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"
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
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