blob: 000ee8dba2ab3069e0459defe3df9d7140541a59 [file] [log] [blame]
Junio C Hamano1a4e8412005-12-27 08:17:231git-receive-pack(1)
2===================
3
4NAME
5----
Junio C Hamano7c73c662007-01-19 00:37:506git-receive-pack - Receive what is pushed into the repository
Junio C Hamano1a4e8412005-12-27 08:17:237
8
9SYNOPSIS
10--------
Junio C Hamano15567bc2011-07-23 00:51:5911[verse]
Junio C Hamano7bd050f2011-09-22 06:32:2212'git-receive-pack' <directory>
Junio C Hamano1a4e8412005-12-27 08:17:2313
14DESCRIPTION
15-----------
Junio C Hamano1aa40d22010-01-21 17:46:4316Invoked by 'git send-pack' and updates the repository with the
Junio C Hamano1a4e8412005-12-27 08:17:2317information fed from the remote end.
18
19This command is usually not invoked directly by the end user.
Junio C Hamano1aa40d22010-01-21 17:46:4320The UI for the protocol is on the 'git send-pack' side, and the
Junio C Hamano1a4e8412005-12-27 08:17:2321program pair is meant to be used to push updates to remote
Junio C Hamanofce7c7e2008-07-02 03:06:3822repository. For pull operations, see linkgit:git-fetch-pack[1].
Junio C Hamano1a4e8412005-12-27 08:17:2323
Junio C Hamano3f680f32009-11-16 02:10:5424The command allows for creation and fast-forwarding of sha1 refs
Junio C Hamano1a4e8412005-12-27 08:17:2325(heads/tags) on the remote end (strictly speaking, it is the
Junio C Hamanoba4b9282008-07-06 05:20:3126local end 'git-receive-pack' runs, but to the user who is sitting at
Junio C Hamano1a4e8412005-12-27 08:17:2327the send-pack end, it is updating the remote. Confused?)
28
Junio C Hamano1a4e8412005-12-27 08:17:2329There are other real-world examples of using update and
30post-update hooks found in the Documentation/howto directory.
31
Junio C Hamanoba4b9282008-07-06 05:20:3132'git-receive-pack' honours the receive.denyNonFastForwards config
Junio C Hamanoabcd65d2007-03-08 02:43:0033option, which tells it if updates to a ref should be denied if they
34are not fast-forwards.
Junio C Hamano1a4e8412005-12-27 08:17:2335
36OPTIONS
37-------
38<directory>::
39The repository to sync into.
40
Junio C Hamanoabcd65d2007-03-08 02:43:0041pre-receive Hook
42----------------
43Before any ref is updated, if $GIT_DIR/hooks/pre-receive file exists
Junio C Hamanoc51fede2007-03-12 07:29:2044and is executable, it will be invoked once with no parameters. The
45standard input of the hook will be one line per ref to be updated:
Junio C Hamanoabcd65d2007-03-08 02:43:0046
Junio C Hamanoc51fede2007-03-12 07:29:2047 sha1-old SP sha1-new SP refname LF
Junio C Hamanoabcd65d2007-03-08 02:43:0048
Junio C Hamanoc51fede2007-03-12 07:29:2049The refname value is relative to $GIT_DIR; e.g. for the master
50head this is "refs/heads/master". The two sha1 values before
Junio C Hamanoabcd65d2007-03-08 02:43:0051each refname are the object names for the refname before and after
Junio C Hamano1d90cb02007-07-03 07:05:3152the update. Refs to be created will have sha1-old equal to 0\{40},
53while refs to be deleted will have sha1-new equal to 0\{40}, otherwise
Junio C Hamanoabcd65d2007-03-08 02:43:0054sha1-old and sha1-new should be valid objects in the repository.
55
Junio C Hamano9236fea2014-10-14 22:28:0956When accepting a signed push (see linkgit:git-push[1]), the signed
57push certificate is stored in a blob and an environment variable
58`GIT_PUSH_CERT` can be consulted for its object name. See the
59description of `post-receive` hook for an example. In addition, the
60certificate is verified using GPG and the result is exported with
61the following environment variables:
62
63`GIT_PUSH_CERT_SIGNER`::
64The name and the e-mail address of the owner of the key that
65signed the push certificate.
66
67`GIT_PUSH_CERT_KEY`::
68The GPG key ID of the key that signed the push certificate.
69
70`GIT_PUSH_CERT_STATUS`::
71The status of GPG verification of the push certificate,
72using the same mnemonic as used in `%G?` format of `git log`
73family of commands (see linkgit:git-log[1]).
74
75`GIT_PUSH_CERT_NONCE`::
76The nonce string the process asked the signer to include
77in the push certificate. If this does not match the value
78recorded on the "nonce" header in the push certificate, it
79may indicate that the certificate is a valid one that is
80being replayed from a separate "git push" session.
81
82`GIT_PUSH_CERT_NONCE_STATUS`::
83`UNSOLICITED`;;
84"git push --signed" sent a nonce when we did not ask it to
85send one.
86`MISSING`;;
87"git push --signed" did not send any nonce header.
88`BAD`;;
89"git push --signed" sent a bogus nonce.
90`OK`;;
91"git push --signed" sent the nonce we asked it to send.
92`SLOP`;;
93"git push --signed" sent a nonce different from what we
94asked it to send now, but in a previous session. See
95`GIT_PUSH_CERT_NONCE_SLOP` environment variable.
96
97`GIT_PUSH_CERT_NONCE_SLOP`::
98"git push --signed" sent a nonce different from what we
99asked it to send now, but in a different session whose
100starting time is different by this many seconds from the
101current session. Only meaningful when
102`GIT_PUSH_CERT_NONCE_STATUS` says `SLOP`.
Junio C Hamano322c6242015-03-23 21:32:46103Also read about `receive.certNonceSlop` variable in
Junio C Hamano9236fea2014-10-14 22:28:09104linkgit:git-config[1].
105
Junio C Hamanoabcd65d2007-03-08 02:43:00106This hook is called before any refname is updated and before any
107fast-forward checks are performed.
108
109If the pre-receive hook exits with a non-zero exit status no updates
110will be performed, and the update, post-receive and post-update
111hooks will not be invoked either. This can be useful to quickly
112bail out if the update is not to be supported.
113
114update Hook
115-----------
116Before each ref is updated, if $GIT_DIR/hooks/update file exists
117and is executable, it is invoked once per ref, with three parameters:
118
119 $GIT_DIR/hooks/update refname sha1-old sha1-new
120
121The refname parameter is relative to $GIT_DIR; e.g. for the master
122head this is "refs/heads/master". The two sha1 arguments are
123the object names for the refname before and after the update.
124Note that the hook is called before the refname is updated,
Junio C Hamano1d90cb02007-07-03 07:05:31125so either sha1-old is 0\{40} (meaning there is no such ref yet),
Junio C Hamanoabcd65d2007-03-08 02:43:00126or it should match what is recorded in refname.
127
128The hook should exit with non-zero status if it wants to disallow
129updating the named ref. Otherwise it should exit with zero.
130
131Successful execution (a zero exit status) of this hook does not
Junio C Hamanoa6387422007-08-25 03:54:27132ensure the ref will actually be updated, it is only a prerequisite.
Junio C Hamanoabcd65d2007-03-08 02:43:00133As such it is not a good idea to send notices (e.g. email) from
134this hook. Consider using the post-receive hook instead.
135
136post-receive Hook
137-----------------
138After all refs were updated (or attempted to be updated), if any
139ref update was successful, and if $GIT_DIR/hooks/post-receive
Junio C Hamano54bf1e22008-12-20 06:30:11140file exists and is executable, it will be invoked once with no
Junio C Hamanoc51fede2007-03-12 07:29:20141parameters. The standard input of the hook will be one line
142for each successfully updated ref:
Junio C Hamanoabcd65d2007-03-08 02:43:00143
Junio C Hamanoc51fede2007-03-12 07:29:20144 sha1-old SP sha1-new SP refname LF
Junio C Hamanoabcd65d2007-03-08 02:43:00145
Junio C Hamanoc51fede2007-03-12 07:29:20146The refname value is relative to $GIT_DIR; e.g. for the master
147head this is "refs/heads/master". The two sha1 values before
Junio C Hamanoabcd65d2007-03-08 02:43:00148each refname are the object names for the refname before and after
149the update. Refs that were created will have sha1-old equal to
Junio C Hamano1d90cb02007-07-03 07:05:311500\{40}, while refs that were deleted will have sha1-new equal to
1510\{40}, otherwise sha1-old and sha1-new should be valid objects in
Junio C Hamanoabcd65d2007-03-08 02:43:00152the repository.
153
Junio C Hamano9236fea2014-10-14 22:28:09154The `GIT_PUSH_CERT*` environment variables can be inspected, just as
155in `pre-receive` hook, after accepting a signed push.
156
Junio C Hamanoabcd65d2007-03-08 02:43:00157Using this hook, it is easy to generate mails describing the updates
158to the repository. This example script sends one mail message per
Junio C Hamano9236fea2014-10-14 22:28:09159ref listing the commits pushed to the repository, and logs the push
160certificates of signed pushes with good signatures to a logger
161service:
Junio C Hamanoabcd65d2007-03-08 02:43:00162
163#!/bin/sh
164# mail out commit update information.
Junio C Hamanoc51fede2007-03-12 07:29:20165while read oval nval ref
Junio C Hamanoabcd65d2007-03-08 02:43:00166do
Junio C Hamanoc51fede2007-03-12 07:29:20167if expr "$oval" : '0*$' >/dev/null
Junio C Hamanoabcd65d2007-03-08 02:43:00168then
169echo "Created a new ref, with the following commits:"
Junio C Hamanofce7c7e2008-07-02 03:06:38170git rev-list --pretty "$nval"
Junio C Hamanoabcd65d2007-03-08 02:43:00171else
172echo "New commits:"
Junio C Hamanofce7c7e2008-07-02 03:06:38173git rev-list --pretty "$nval" "^$oval"
Junio C Hamanoabcd65d2007-03-08 02:43:00174fi |
Junio C Hamanoc51fede2007-03-12 07:29:20175mail -s "Changes to ref $ref" commit-list@mydomain
Junio C Hamanoabcd65d2007-03-08 02:43:00176done
Junio C Hamano9236fea2014-10-14 22:28:09177# log signed push certificate, if any
178if test -n "${GIT_PUSH_CERT-}" && test ${GIT_PUSH_CERT_STATUS} = G
179then
180(
181echo expected nonce is ${GIT_PUSH_NONCE}
182git cat-file blob ${GIT_PUSH_CERT}
183) | mail -s "push certificate from $GIT_PUSH_CERT_SIGNER" push-log@mydomain
184fi
Junio C Hamanoabcd65d2007-03-08 02:43:00185exit 0
186
187The exit code from this hook invocation is ignored, however a
188non-zero exit code will generate an error message.
189
190Note that it is possible for refname to not have sha1-new when this
191hook runs. This can easily occur if another user modifies the ref
Junio C Hamanoba4b9282008-07-06 05:20:31192after it was updated by 'git-receive-pack', but before the hook was able
Junio C Hamanoabcd65d2007-03-08 02:43:00193to evaluate it. It is recommended that hooks rely on sha1-new
194rather than the current value of refname.
195
196post-update Hook
197----------------
198After all other processing, if at least one ref was updated, and
199if $GIT_DIR/hooks/post-update file exists and is executable, then
Junio C Hamano54bf1e22008-12-20 06:30:11200post-update will be called with the list of refs that have been updated.
Junio C Hamanoabcd65d2007-03-08 02:43:00201This can be used to implement any repository wide cleanup tasks.
202
203The exit code from this hook invocation is ignored; the only thing
Junio C Hamanoba4b9282008-07-06 05:20:31204left for 'git-receive-pack' to do at that point is to exit itself
Junio C Hamanoabcd65d2007-03-08 02:43:00205anyway.
206
Junio C Hamanofce7c7e2008-07-02 03:06:38207This hook can be used, for example, to run `git update-server-info`
Junio C Hamanoabcd65d2007-03-08 02:43:00208if the repository is packed and is served via a dumb transport.
209
210#!/bin/sh
Junio C Hamanofce7c7e2008-07-02 03:06:38211exec git update-server-info
Junio C Hamanoabcd65d2007-03-08 02:43:00212
Junio C Hamano1a4e8412005-12-27 08:17:23213
214SEE ALSO
215--------
Junio C Hamanof7279012011-08-18 06:13:13216linkgit:git-send-pack[1], linkgit:gitnamespaces[7]
Junio C Hamano1a4e8412005-12-27 08:17:23217
Junio C Hamano1a4e8412005-12-27 08:17:23218GIT
219---
Junio C Hamanof7c042d2008-06-06 22:50:53220Part of the linkgit:git[1] suite