Git Post-Receive Hook for Website Staging

git, git-post-receive

Solution

The answer to your question is here: http://toroid.org/ams/git-website-howto

In short, what you want to do is add a "detached work tree" to the bare repository. Normally you think of your work tree as containing the `.git` directory. Bare repositories do not have a work tree by definition, but you can create one as long as it's in a different directory than the bare repo.

The post-receive hook is just a simple `git checkout -f` to replicate the repository's `HEAD` into the work directory. Apache uses that as its document root, and you're all set. Any time you push to the bare repository, Apache will immediately start serving it.

I generally use this to automatically push to a staging server to see if the "real" environment will puke on my changes. Deploying to the live server is a completely different story. :-)

Problem

I'm trying to set up Git for staging my website so that I can `git pull` to get the current version to work on locally and then `git push` to push the changes to the remote server. I've got it set up so that it works the way I want it to, but after I push, I have to manually run `git checkout -f` or `git reset --hard HEAD` on the remote server. I've tried putting these into a shell script as the post-receive hook on the server, but it just doesn't seem to have any effect. I know that the script is running because I'm seeing "Changes pushed to server" after I push. Here's the post-receive hook: ``` #!/bin/sh git reset --hard HEAD echo "Changes pushed to server." ```

Original source

Related problems