Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Git push to prod
# Use git to push to deploy (aka git push to prod)
# Use 'git push remote master' to push to deploy
# This script only deploys on pushes to master.
# On your server to deploy, create a bare git directory
# (somewhere like /var/git/<gitProject>)
# Your depoly directory (like /var/www) should be somewhere other than your git repo.
# git --bare init
# Put this script into <gitProject>/hooks/post-receive on the deploy server
# Make sure this script has execute permissions (chmod +x post-receive)
# Then add this remote repo as a remote in git.
# git remote add deployServer ssh://<gitProject>
# Then use ssh to push to production.
# git push deployServer master
# You can create a group (like "git"), make it owner of this file
# Then add every user that needs to push to the that group.
# See for more background.
echo 'start repo to prod'
OWNER="OwnerOfTheProject example: www:www"
function push(){
git --work-tree=$PROJPATH --git-dir=$GITPATH checkout -f master
find $PROJPATH/* -type d -exec chmod 775 {} \;
find $PROJPATH/* -type f -exec chmod 664 {} \;
echo 'push complete'
#If executed from shell, push latest master commit regardless.
#This allows you to re-push by entering "./post-receive" from the command line.
if [ -t 0 ]; then
#Determine the branch, only push to prod on master.
while read oldrev newrev refname
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
echo 'Master branch. Pushing to prod'
echo 'Not on master. Not pushing to prod'
echo 'End repo to prod'
Copy link

borgogelli commented Nov 8, 2016

What is the purpose of this script ? Should I put the script on my private git server or on the hosting server (where I pull the code with the git client) ? What is not clear to me, it's your definition of production server.

Copy link

zamicol commented Nov 10, 2016

Hi @borgogelli. I've updated the gist with a better description. Let me know if this answers your question.

Copy link

ghost commented Sep 28, 2017

Does this still work? I know now that the file is named ‘push-update’ instead of ‘push-receive’

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment