123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #!/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".
- umask 002
- 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;; esac
- fi
- 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
- done
- fi
|