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."
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. :-)