todo/.git/hooks/pre-push.sample

go back
1 | #!/bin/sh
2 |
3 | # An example hook script to verify what is about to be pushed. Called by "git
4 | # push" after it has checked the remote status, but before anything has been
5 | # pushed. If this script exits with a non-zero status nothing will be pushed.
6 | #
7 | # This hook is called with the following parameters:
8 | #
9 | # $1 -- Name of the remote to which the push is being done
10 | # $2 -- URL to which the push is being done
11 | #
12 | # If pushing without using a named remote those arguments will be equal.
13 | #
14 | # Information about the commits which are being pushed is supplied as lines to
15 | # the standard input in the form:
16 | #
17 | # <local ref> <local oid> <remote ref> <remote oid>
18 | #
19 | # This sample shows how to prevent push of commits where the log message starts
20 | # with "WIP" (work in progress).
21 |
22 | remote="$1"
23 | url="$2"
24 |
25 | zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
26 |
27 | while read local_ref local_oid remote_ref remote_oid
28 | do
29 | if test "$local_oid" = "$zero"
30 | then
31 | # Handle delete
32 | :
33 | else
34 | if test "$remote_oid" = "$zero"
35 | then
36 | # New branch, examine all commits
37 | range="$local_oid"
38 | else
39 | # Update to existing branch, examine new commits
40 | range="$remote_oid..$local_oid"
41 | fi
42 |
43 | # Check for WIP commit
44 | commit=$(git rev-list -n 1 --grep '^WIP' "$range")
45 | if test -n "$commit"
46 | then
47 | echo >&2 "Found WIP commit in $local_ref, not pushing"
48 | exit 1
49 | fi
50 | fi
51 | done
52 |
53 | exit 0