Skip to content

Commit 66989e7

Browse files
djalmaoliveiraschacon
authored andcommitted
Adding a little of content about git hooks -> 31_Git_Hooks
Content used from http://www.kernel.org/pub/software/scm/git/docs/githooks.html Signed-off-by: Scott Chacon <schacon@gmail.com>
1 parent be94ecb commit 66989e7

File tree

1 file changed

+320
-26
lines changed

1 file changed

+320
-26
lines changed

text/31_Git_Hooks/0_ Git_Hooks.markdown

100644100755
Lines changed: 320 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,69 @@
11
## Git Hooks ##
22

3-
[Git Hooks](http://www.kernel.org/pub/software/scm/git/docs/githooks.html)
3+
Hooks are little scripts you can place in $GIT_DIR/hooks directory to trigger
4+
action at certain points. When git-init is run, a handful example hooks are
5+
copied in the hooks directory of the new repository, but by default they are
6+
all disabled. To enable a hook, rename it by removing its .sample suffix.
47

5-
### Server Side Hooks ###
68

7-
#### Post Receive ####
9+
### applypatch-msg ###
810

11+
GIT_DIR/hooks/applypatch-msg
12+
13+
This hook is invoked by git-am script. It takes a single parameter, the name
14+
of the file that holds the proposed commit log message. Exiting with non-zero
15+
status causes git-am to abort before applying the patch.
916

10-
GIT_DIR/hooks/post-receive
17+
The hook is allowed to edit the message file in place, and can be used to
18+
normalize the message into some project standard format (if the project has one).
19+
It can also be used to refuse the commit after inspecting the message file.
20+
The default applypatch-msg hook, when enabled, runs the commit-msg hook, if the
21+
latter is enabled.
1122

12-
If you wrote it in Ruby, you might get the args this way:
1323

14-
ruby
15-
rev_old, rev_new, ref = STDIN.read.split(" ")
24+
### pre-applypatch ###
1625

17-
Or in a bash script, something like this would work:
18-
19-
#!/bin/sh
20-
# <oldrev> <newrev> <refname>
21-
# update a blame tree
22-
while read oldrev newrev ref
23-
do
24-
echo "STARTING [$oldrev $newrev $ref]"
25-
for path in `git diff-tree -r $oldrev..$newrev | awk '{print $6}'`
26-
do
27-
echo "git update-ref refs/blametree/$ref/$path $newrev"
28-
`git update-ref refs/blametree/$ref/$path $newrev`
29-
done
30-
done
31-
26+
GIT_DIR/hooks/pre-applypatch
27+
28+
This hook is invoked by git-am. It takes no parameter, and is invoked after the
29+
patch is applied, but before a commit is made.
30+
If it exits with non-zero status, then the working tree will not be committed
31+
after applying the patch.
32+
33+
It can be used to inspect the current working tree and refuse to make a commit
34+
if it does not pass certain test.
35+
The default pre-applypatch hook, when enabled, runs the pre-commit hook, if the
36+
latter is enabled.
37+
38+
39+
### post-applypatch ###
3240

33-
### Client Side Hooks ###
41+
GIT_DIR/hooks/post-applypatch
42+
43+
This hook is invoked by 'git-am'. It takes no parameter,
44+
and is invoked after the patch is applied and a commit is made.
3445

46+
This hook is meant primarily for notification, and cannot affect
47+
the outcome of 'git-am'.
3548

36-
#### Pre Commit ####
3749

38-
Running your tests automatically before you commit
50+
### pre-commit ###
51+
52+
GIT_DIR/hooks/pre-commit
3953

40-
GIT_DIR/hooks/pre-commit
54+
This hook is invoked by 'git-commit', and can be bypassed
55+
with `\--no-verify` option. It takes no parameter, and is
56+
invoked before obtaining the proposed commit log message and
57+
making a commit. Exiting with non-zero status from this script
58+
causes the 'git-commit' to abort.
59+
60+
The default 'pre-commit' hook, when enabled, catches introduction
61+
of lines with trailing whitespaces and aborts the commit when
62+
such a line is found.
63+
64+
All the 'git-commit' hooks are invoked with the environment
65+
variable `GIT_EDITOR=:` if the command will not bring up an editor
66+
to modify the commit message.
4167

4268
Here is an example of a Ruby script that runs RSpec tests before allowing a commit.
4369

@@ -61,4 +87,272 @@ Here is an example of a Ruby script that runs RSpec tests before allowing a comm
6187
exit 1
6288
end
6389

90+
91+
### prepare-commit-msg ###
92+
93+
GIT_DIR/hooks/prepare-commit-msg
94+
95+
This hook is invoked by 'git-commit' right after preparing the
96+
default log message, and before the editor is started.
97+
98+
It takes one to three parameters. The first is the name of the file
99+
that the commit log message. The second is the source of the commit
100+
message, and can be: `message` (if a `-m` or `-F` option was
101+
given); `template` (if a `-t` option was given or the
102+
configuration option `commit.template` is set); `merge` (if the
103+
commit is a merge or a `.git/MERGE_MSG` file exists); `squash`
104+
(if a `.git/SQUASH_MSG` file exists); or `commit`, followed by
105+
a commit SHA1 (if a `-c`, `-C` or `\--amend` option was given).
106+
107+
If the exit status is non-zero, 'git-commit' will abort.
108+
109+
The purpose of the hook is to edit the message file in place, and
110+
it is not suppressed by the `\--no-verify` option. A non-zero exit
111+
means a failure of the hook and aborts the commit. It should not
112+
be used as replacement for pre-commit hook.
113+
114+
The sample `prepare-commit-msg` hook that comes with git comments
115+
out the `Conflicts:` part of a merge's commit message.
116+
117+
118+
### commit-msg ###
119+
120+
GIT_DIR/hooks/commit-msg
121+
122+
This hook is invoked by 'git-commit', and can be bypassed
123+
with `\--no-verify` option. It takes a single parameter, the
124+
name of the file that holds the proposed commit log message.
125+
Exiting with non-zero status causes the 'git-commit' to
126+
abort.
127+
128+
The hook is allowed to edit the message file in place, and can
129+
be used to normalize the message into some project standard
130+
format (if the project has one). It can also be used to refuse
131+
the commit after inspecting the message file.
132+
133+
The default 'commit-msg' hook, when enabled, detects duplicate
134+
"Signed-off-by" lines, and aborts the commit if one is found.
135+
136+
137+
### post-commit ###
138+
139+
GIT_DIR/hooks/post-commit
140+
141+
This hook is invoked by 'git-commit'. It takes no
142+
parameter, and is invoked after a commit is made.
143+
144+
This hook is meant primarily for notification, and cannot affect
145+
the outcome of 'git-commit'.
146+
147+
148+
### pre-rebase ###
149+
150+
GIT_DIR/hooks/pre-rebase
151+
152+
This hook is called by 'git-rebase' and can be used to prevent a branch
153+
from getting rebased.
154+
155+
156+
### post-checkout ###
157+
158+
GIT_DIR/hooks/post-checkout
159+
160+
This hook is invoked when a 'git-checkout' is run after having updated the
161+
worktree. The hook is given three parameters: the ref of the previous HEAD,
162+
the ref of the new HEAD (which may or may not have changed), and a flag
163+
indicating whether the checkout was a branch checkout (changing branches,
164+
flag=1) or a file checkout (retrieving a file from the index, flag=0).
165+
This hook cannot affect the outcome of 'git-checkout'.
166+
167+
This hook can be used to perform repository validity checks, auto-display
168+
differences from the previous HEAD if different, or set working dir metadata
169+
properties.
170+
171+
172+
### post-merge ###
173+
174+
GIT_DIR/hooks/post-merge
175+
176+
This hook is invoked by 'git-merge', which happens when a 'git-pull'
177+
is done on a local repository. The hook takes a single parameter, a status
178+
flag specifying whether or not the merge being done was a squash merge.
179+
This hook cannot affect the outcome of 'git-merge' and is not executed,
180+
if the merge failed due to conflicts.
181+
182+
This hook can be used in conjunction with a corresponding pre-commit hook to
183+
save and restore any form of metadata associated with the working tree
184+
(eg: permissions/ownership, ACLS, etc). See contrib/hooks/setgitperms.perl
185+
for an example of how to do this.
186+
187+
188+
### pre-receive ###
189+
190+
GIT_DIR/hooks/pre-receive
191+
192+
This hook is invoked by 'git-receive-pack' on the remote repository,
193+
which happens when a 'git-push' is done on a local repository.
194+
Just before starting to update refs on the remote repository, the
195+
pre-receive hook is invoked. Its exit status determines the success
196+
or failure of the update.
197+
198+
This hook executes once for the receive operation. It takes no
199+
arguments, but for each ref to be updated it receives on standard
200+
input a line of the format:
201+
202+
<old-value> SP <new-value> SP <ref-name> LF
203+
204+
where `<old-value>` is the old object name stored in the ref,
205+
`<new-value>` is the new object name to be stored in the ref and
206+
`<ref-name>` is the full name of the ref.
207+
When creating a new ref, `<old-value>` is 40 `0`.
208+
209+
If the hook exits with non-zero status, none of the refs will be
210+
updated. If the hook exits with zero, updating of individual refs can
211+
still be prevented by the <<update,'update'>> hook.
212+
213+
Both standard output and standard error output are forwarded to
214+
'git-send-pack' on the other end, so you can simply `echo` messages
215+
for the user.
216+
217+
If you wrote it in Ruby, you might get the args this way:
218+
219+
ruby
220+
rev_old, rev_new, ref = STDIN.read.split(" ")
221+
222+
Or in a bash script, something like this would work:
223+
224+
#!/bin/sh
225+
# <oldrev> <newrev> <refname>
226+
# update a blame tree
227+
while read oldrev newrev ref
228+
do
229+
echo "STARTING [$oldrev $newrev $ref]"
230+
for path in `git diff-tree -r $oldrev..$newrev | awk '{print $6}'`
231+
do
232+
echo "git update-ref refs/blametree/$ref/$path $newrev"
233+
`git update-ref refs/blametree/$ref/$path $newrev`
234+
done
235+
done
236+
237+
238+
### update ###
239+
240+
GIT_DIR/hooks/update
241+
242+
This hook is invoked by 'git-receive-pack' on the remote repository,
243+
which happens when a 'git-push' is done on a local repository.
244+
Just before updating the ref on the remote repository, the update hook
245+
is invoked. Its exit status determines the success or failure of
246+
the ref update.
247+
248+
The hook executes once for each ref to be updated, and takes
249+
three parameters:
250+
251+
- the name of the ref being updated,
252+
- the old object name stored in the ref,
253+
- and the new objectname to be stored in the ref.
254+
255+
A zero exit from the update hook allows the ref to be updated.
256+
Exiting with a non-zero status prevents 'git-receive-pack'
257+
from updating that ref.
258+
259+
This hook can be used to prevent 'forced' update on certain refs by
260+
making sure that the object name is a commit object that is a
261+
descendant of the commit object named by the old object name.
262+
That is, to enforce a "fast forward only" policy.
263+
264+
It could also be used to log the old..new status. However, it
265+
does not know the entire set of branches, so it would end up
266+
firing one e-mail per ref when used naively, though. The
267+
<<post-receive,'post-receive'>> hook is more suited to that.
268+
269+
Another use suggested on the mailing list is to use this hook to
270+
implement access control which is finer grained than the one
271+
based on filesystem group.
272+
273+
Both standard output and standard error output are forwarded to
274+
'git-send-pack' on the other end, so you can simply `echo` messages
275+
for the user.
276+
277+
The default 'update' hook, when enabled--and with
278+
`hooks.allowunannotated` config option turned on--prevents
279+
unannotated tags to be pushed.
280+
281+
282+
### post-receive ###
283+
284+
GIT_DIR/hooks/post-receive
285+
286+
This hook is invoked by 'git-receive-pack' on the remote repository,
287+
which happens when a 'git-push' is done on a local repository.
288+
It executes on the remote repository once after all the refs have
289+
been updated.
290+
291+
This hook executes once for the receive operation. It takes no
292+
arguments, but gets the same information as the
293+
<<pre-receive,'pre-receive'>>
294+
hook does on its standard input.
295+
296+
This hook does not affect the outcome of 'git-receive-pack', as it
297+
is called after the real work is done.
298+
299+
This supersedes the <<post-update,'post-update'>> hook in that it gets
300+
both old and new values of all the refs in addition to their
301+
names.
302+
303+
Both standard output and standard error output are forwarded to
304+
'git-send-pack' on the other end, so you can simply `echo` messages
305+
for the user.
306+
307+
The default 'post-receive' hook is empty, but there is
308+
a sample script `post-receive-email` provided in the `contrib/hooks`
309+
directory in git distribution, which implements sending commit
310+
emails.
311+
312+
313+
### post-update ###
314+
315+
GIT_DIR/hooks/post-update
316+
317+
This hook is invoked by 'git-receive-pack' on the remote repository,
318+
which happens when a 'git-push' is done on a local repository.
319+
It executes on the remote repository once after all the refs have
320+
been updated.
321+
322+
It takes a variable number of parameters, each of which is the
323+
name of ref that was actually updated.
324+
325+
This hook is meant primarily for notification, and cannot affect
326+
the outcome of 'git-receive-pack'.
327+
328+
The 'post-update' hook can tell what are the heads that were pushed,
329+
but it does not know what their original and updated values are,
330+
so it is a poor place to do log old..new. The
331+
<<post-receive,'post-receive'>> hook does get both original and
332+
updated values of the refs. You might consider it instead if you need
333+
them.
334+
335+
When enabled, the default 'post-update' hook runs
336+
'git-update-server-info' to keep the information used by dumb
337+
transports (e.g., HTTP) up-to-date. If you are publishing
338+
a git repository that is accessible via HTTP, you should
339+
probably enable this hook.
340+
341+
Both standard output and standard error output are forwarded to
342+
'git-send-pack' on the other end, so you can simply `echo` messages
343+
for the user.
344+
345+
346+
### pre-auto-gc ###
347+
348+
GIT_DIR/hooks/pre-auto-gc
349+
350+
This hook is invoked by 'git-gc --auto'. It takes no parameter, and
351+
exiting with non-zero status from this script causes the 'git-gc --auto'
352+
to abort.
353+
354+
355+
### References ###
356+
357+
[Git Hooks](http://www.kernel.org/pub/software/scm/git/docs/githooks.html)
64358
* http://probablycorey.wordpress.com/2008/03/07/git-hooks-make-me-giddy/

0 commit comments

Comments
 (0)