Deploy a project using Git push Deploy a project using Git push git git

Deploy a project using Git push


I found this script on this site and it seems to work quite well.

  1. Copy over your .git directory to your web server
  2. On your local copy, modify your .git/config file and add your web server as a remote:

    [remote "production"]    url = username@webserver:/path/to/htdocs/.git
  3. On the server, replace .git/hooks/post-update with this file (in the answer below)

  4. Add execute access to the file (again, on the server):

    chmod +x .git/hooks/post-update
  5. Now, just locally push to your web server and it should automatically update the working copy:

    git push production


Using the post-update file below:

  1. Copy over your .git directory to your web server
  2. On your local copy, modify your .git/config file and add your web server as a remote:

    [remote "production"]    url = username@webserver:/path/to/htdocs/.git
  3. On the server, replace .git/hooks/post-update with file below

  4. Add execute access to the file (again, on the server):

    chmod +x .git/hooks/post-update
  5. Now, just locally push to your web server and it should automatically update the working copy:

    git push production
#!/bin/sh## This hook does two things:##  1. update the "info" files that allow the list of references to be#     queries over dumb transports such as http##  2. if this repository looks like it is a non-bare repository, and#     the checked-out branch is pushed to, then update the working copy.#     This makes "push" function somewhat similarly to darcs and bzr.## To enable this hook, make this file executable by "chmod +x post-update". git-update-server-info is_bare=$(git-config --get --bool core.bare) if [ -z "$is_bare" ]then      # for compatibility's sake, guess      git_dir_full=$(cd $GIT_DIR; pwd)      case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esacfi update_wc() {      ref=$1      echo "Push to checked out branch $ref" >&2      if [ ! -f $GIT_DIR/logs/HEAD ]      then             echo "E:push to non-bare repository requires a HEAD reflog" >&2             exit 1      fi      if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)      then             wc_dirty=0      else             echo "W:unstaged changes found in working copy" >&2             wc_dirty=1             desc="working copy"      fi      if git diff-index --cached HEAD@{1} >/dev/null      then             index_dirty=0      else             echo "W:uncommitted, staged changes found" >&2             index_dirty=1             if [ -n "$desc" ]             then                   desc="$desc and index"             else                   desc="index"             fi      fi      if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]      then             new=$(git rev-parse HEAD)             echo "W:stashing dirty $desc - see git-stash(1)" >&2             ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT             git-update-ref --no-deref HEAD HEAD@{1}             cd $GIT_WORK_TREE             git stash save "dirty $desc before update to $new";             git-symbolic-ref HEAD "$ref"             )      fi       # eye candy - show the WC updates :)      echo "Updating working copy" >&2      (cd $GIT_WORK_TREE      git-diff-index -R --name-status HEAD >&2      git-reset --hard HEAD)} if [ "$is_bare" = "false" ]then      active_branch=`git-symbolic-ref HEAD`      export GIT_DIR=$(cd $GIT_DIR; pwd)      GIT_WORK_TREE=${GIT_WORK_TREE-..}      for ref      do             if [ "$ref" = "$active_branch" ]             then                   update_wc $ref             fi      donefi


After many false starts and dead ends, I'm finally able to deploy website code with just "git push remote" thanks to this article.

The author's post-update script is only one line long and his solution doesn't require .htaccess configuration to hide the Git repo as some others do.

A couple of stumbling blocks if you're deploying this on an Amazon EC2 instance;

1) If you use sudo to create the bare destination repository, you have to change the owner of the repo to ec2-user or the push will fail. (Try "chown ec2-user:ec2-user repo.")

2) The push will fail if you don't pre-configure the location of your amazon-private-key.pem, either in /etc/ssh/ssh_config as an IdentityFile parameter or in ~/.ssh/config using the "[Host] - HostName - IdentityFile - User" layout described here...

...HOWEVER if Host is configured in ~/.ssh/config and different than HostName the Git push will fail. (That's probably a Git bug)