I am attempting to setup GIT to deploy my project to different locations based on the branch. (I think this is what I want to do anyway).
My current setup is this: Local dev machine running Netbeans to make changes. Remote server hosting GIT projects (same server running apache) - 2 subsites exist a test.FQDN.com and a live.FQDN.com

What I would like to do is have 1 GIT project (MyProject) and create a new feature branch. Any commits done to the new feature branch would push to test.FQDN.com. Once the features have been tested and then merged into the master branch, it would push to live.FQDN.com. I have looked at GIT's post-receive hooks and was able to use "git checkout -f" command to pull on the test.FQDN.com site however that only pulls the master branch and not the new feature branch. I do not have any funding to use a third party to make this work, and would prefer to stay within GIT but have full root access to the web server if there is a package to install which would help control this. Any suggestions would be great!

EDIT Here is what my post-receive looks like currently:

umask 002
cd /srv/git/projects/APP.git
git push --mirror backupLocation:APP
branch=$(git branch | grep "*" | sed "s/* //")

if [ "$branch" == "master" ]
    GIT_WORK_TREE=/srv/www/ssl_apps/APP git checkout -f
    GIT_WORK_TREE=/srv/www/ssl_apps/APPtest git checkout -f
  • What are you using to deploy?
    – nickgrim
    Feb 8 '13 at 12:02
  • I am still using Git's post-receive hooks for all deployments, please refer to my edit above for the code I am currently using.
    – Brian
    Feb 10 '13 at 4:22

our system in a nutshell:


if a branch was pushed, git post-receive hooks increments a number in static file /var/www/<branch>.version

at client server (there are multiple servers, multiple installations per server):

cron script runs every minute, it checks www.git-server.com/<branch>.version for every branch

if version was incremented it does the update:

cd /var/<branch>.subsite;
git pull --rebase

one minute delay (max) is OK for our purposes

  • Your post-receive hooks are vital here, yet not included in the answer.
    – gertvdijk
    Dec 14 '12 at 14:39

You can use reset --hard <branchname> to put your working copy in a detached-HEAD state; change the latter part of your post-receive hook to:

if [ "$branch" == "master" ]
    GIT_WORK_TREE=/srv/www/ssl_apps/APP git reset --hard $branch
    GIT_WORK_TREE=/srv/www/ssl_apps/APPtest git reset --hard $branch

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.