2

I am developing a web application using Gitosis (Debian Lenny) that I want to be able to push to different remote repos/locations thus allowing a "bleeding-edge", "release-candidate", & "production" version of the application with mirrored physical web directories and codebase. I would prefer each directory to have a branch of the application. So one repository, three "live" versions.

I am new to Git so there's probably a better solution but what i've come up w/ so far is either finding a way to attach hooks to branches (which I haven't found) or to write a hook that will filter for which branch is being committed.

My question is on how to set up a post-update hook that will check the committed branch, set a variable for the directory based on that branch, and literally copy the codebase into that directory where it can be instantly accessible over HTTP?

git rev-list --branches --pretty=oneline --max-count=1

will return something like:

cc5112ba59bc82f2e847ac264317c062ce80f69f test commit

but i need the name of the branch itself like "experimental" or "master".

So basically I'm looking for something like:

1) Get name of branch that was just committed (e.g. "master", "experimental") into a string

2) Use Bash case to declare what directory to use

3) Run something like "git archive --format=tar HEAD | (cd $LOCATION && tar xf -)" where location is what was returned from case.

I thought I was getting close with the following but realized it didn't return the branch name but the commit message instead:

#!/bin/sh

# Get substr from "sha1[space]commit-msg"
BRANCH=$(git rev-list --pretty=oneline --branches --max-count=1 | awk '{split($0,array," ")} END{print array[2]}')
case $BRANCH in
    "experimental")
        dir="/home/APP_NAME/experimental"
    ;;
    "master")
        dir="/home/APP_NAME/production"
    ;;
esac
# move to location and copy files
git archive --format=tar HEAD | (cd $loc && tar xf -)

I did realize that if I always put the branch as the first part of the commit I could accomplish something like this but I really don't want to worry about it.

Any help would be appreciated. Thanks in advance!

Mark Longair
  • 385,867
  • 66
  • 394
  • 320
cka
  • 93
  • 1
  • 7

2 Answers2

0

Should you push to a non-bare repo (which isn't a recommended technique, but can work with this post-update hook), you can complete that hook, knowing that:

git symbolic-ref HEAD
# or
git rev-parse HEAD

Give you the name of the current branch, while $ref represents the branch being pushed.
You can then update three different working tree, each one already set on the right branch.

Community
  • 1
  • 1
VonC
  • 1,042,979
  • 435
  • 3,649
  • 4,283
0

Perhaps I'm missing something, but if this is in a post-update hook then you get the names of the refs that are being updated as parameters to the hook. e.g. if my push updates master and experimental in a repository, then post-update is invoked with:

 post-update refs/heads/master refs/heads/experimental

... and you can access them with $1 as $2 usual in your hook script.

Incidentally, the githooks documentation points out that you might want to consider using the post-receive hook instead, which instead gets information on standard input - however, it also gives you the old and new values of the ref as well as the ref name, which might be useful.

Mark Longair
  • 385,867
  • 66
  • 394
  • 320