blob: 25665a3470bccb4a186a2008098c166c68caf58b [file] [log] [blame]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001= Gerrit Code Review - Uploading Changes
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -08002
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -07003Gerrit supports three methods of uploading changes:
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -08004
5* Use `repo upload`, to create changes for review
6* Use `git push`, to create changes for review
7* Use `git push`, and bypass code review
8
David Pursehousebaac4252013-01-25 17:42:19 +09009All three methods rely on authentication, which must first be configured
10by the uploading user.
11
12Gerrit supports two methods of authenticating the uploading user. SSH
13public key, and HTTP/HTTPS.
14
Edwin Kempin60ab8532013-03-27 14:33:46 +010015[[http]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080016== HTTP/HTTPS
David Pursehousebaac4252013-01-25 17:42:19 +090017
18On Gerrit installations that do not support SSH authentication, the
19user must authenticate via HTTP/HTTPS.
20
21When link:config-gerrit.html#auth.gitBasicAuth[gitBasicAuth] is enabled,
22the user is authenticated using standard BasicAuth and credentials validated
Luca Milanesiob281cd42014-03-05 23:46:26 +000023using the randomly generated HTTP password on the `HTTP Password` tab
24in the user settings page or against LDAP when configured for the Gerrit Web UI.
David Pursehousebaac4252013-01-25 17:42:19 +090025
26When gitBasicAuth is not configured, the user's HTTP credentials can be
27accessed within Gerrit by going to `Settings`, and then accessing the `HTTP
28Password` tab.
29
30For Gerrit installations where an link:config-gerrit.html#auth.httpPasswordUrl[HTTP password URL]
31is configured, the password can be obtained by clicking on `Obtain Password`
32and then following the site-specific instructions. On sites where this URL is
33not configured, the password can be obtained by clicking on `Generate Password`.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080034
Edwin Kempin1f556222015-04-22 13:24:39 +020035[[ssh]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080036== SSH
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080037
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070038Each user uploading changes to Gerrit must configure one or more SSH
39public keys. The per-user SSH key list can be accessed over the web
Edwin Kempinb5df3b82011-10-10 11:31:14 +020040within Gerrit by `Settings`, and then accessing the `SSH Public Keys`
41tab.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080042
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070043[[configure_ssh]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080044=== Configuration
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080045
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070046To register a new SSH key for use with Gerrit, paste the contents of
47your `id_rsa.pub` or `id_dsa.pub` file into the text box and click
48the add button. Gerrit only understands SSH version 2 public keys.
49Keys may be supplied in either the OpenSSH format (key starts with
50`ssh-rsa` or `ssh-dss`) or the RFC 4716 format (file starts with
51`---- BEGIN SSH2 PUBLIC KEY ----`).
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080052
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070053Typically SSH keys are stored in your home directory, under `~/.ssh`.
54If you don't have any keys yet, you can create a new one and protect
55it with a passphrase:
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080056
57====
58 ssh-keygen -t rsa
59====
60
61Then copy the content of the public key file onto your clipboard,
62and paste it into Gerrit's web interface:
63
64====
65 cat ~/.ssh/id_rsa.pub
66====
67
68[TIP]
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070069Users who frequently upload changes will also want to consider
David Pursehouse221d4f62012-06-08 17:38:08 +090070starting an `ssh-agent`, and adding their private key to the list
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070071managed by the agent, to reduce the frequency of entering the
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080072key's passphrase. Consult `man ssh-agent`, or your SSH client's
73documentation, for more details on configuration of the agent
74process and how to add the private key.
75
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -070076[[test_ssh]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080077=== Testing Connections
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080078
79To verify your SSH key is working correctly, try using an SSH client
David Pursehouse221d4f62012-06-08 17:38:08 +090080to connect to Gerrit's SSHD port. By default Gerrit runs on
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080081port 29418, using the same hostname as the web server:
82
83====
Edwin Kempinfb95a1b2011-10-05 10:08:00 +020084..................................................................
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080085 $ ssh -p 29418 sshusername@hostname
Edwin Kempinfb95a1b2011-10-05 10:08:00 +020086
87 **** Welcome to Gerrit Code Review ****
88
89 Hi John Doe, you have successfully connected over SSH.
90
91 Unfortunately, interactive shells are disabled.
92 To clone a hosted Git repository, use:
93
94 git clone ssh://sshusername@hostname:29418/REPOSITORY_NAME.git
95
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080096 Connection to hostname closed.
Edwin Kempinfb95a1b2011-10-05 10:08:00 +020097..................................................................
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -080098====
99
Edwin Kempinfb95a1b2011-10-05 10:08:00 +0200100In the command above, `sshusername` was configured as `Username` on
101the `Profile` tab of the `Settings` screen. If it is not set,
102propose a name and use `Select Username` to select the name.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800103
104To determine the port number Gerrit is running on, visit the special
105information URL `http://'hostname'/ssh_info`, and copy the port
106number from the second field:
107
108====
109 $ curl http://hostname/ssh_info
110 hostname 29418
111====
112
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800113If you are developing an automated tool to perform uploads to Gerrit,
114let the user supply the hostname or the web address for Gerrit,
115and obtain the port number on the fly from the `/ssh_info` URL.
116The returned output from this URL is always `'hostname' SP 'port'`,
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700117or `NOT_AVAILABLE` if the SSHD server is not currently running.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800118
119
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800120== git push
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800121
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700122[[push_create]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800123=== Create Changes
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800124
David Pursehouse221d4f62012-06-08 17:38:08 +0900125To create new changes for review, simply push to the project's
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800126magical `refs/for/'branch'` ref using any Git client tool:
127
128====
Shawn Pearce69928a62013-02-24 18:01:27 -0800129 git push ssh://sshusername@hostname:29418/projectname HEAD:refs/for/branch
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800130====
131
132E.g. `john.doe` can use git push to upload new changes for the
133`experimental` branch of project `kernel/common`, hosted at the
134`git.example.com` Gerrit server:
135
136====
137 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/experimental
138====
139
140Each new commit uploaded by the `git push` client will be
141converted into a change record on the server. The remote ref
142`refs/for/experimental` is not actually created by Gerrit, even
143though the client's status messages may say otherwise.
144
145Other users (e.g. project owners) who have configured Gerrit to
146notify them of new changes will be automatically sent an email
147message when the push is completed.
148
Edwin Kempin1f556222015-04-22 13:24:39 +0200149[[topic]]
Shawn O. Pearced50c94e2010-07-15 12:24:11 -0700150To include a short tag associated with all of the changes in the
151same group, such as the local topic branch name, append it after
Shawn Pearce69928a62013-02-24 18:01:27 -0800152the destination branch name. In this example the short topic tag
Shawn O. Pearced50c94e2010-07-15 12:24:11 -0700153'driver/i42' will be saved on each change this push creates or
154updates:
155
156====
Shawn Pearce69928a62013-02-24 18:01:27 -0800157 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/experimental%topic=driver/i42
Shawn O. Pearced50c94e2010-07-15 12:24:11 -0700158====
159
Gustaf Lundh48191712014-10-03 10:29:59 +0200160[[review_labels]]
David Pursehouse93733b62014-10-03 12:26:04 +0900161Review labels can be applied to the change by using the `label` (or `l`)
162option in the reference:
Gustaf Lundhe235a062014-10-03 10:29:59 +0200163
164====
165 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/experimental%l=Verified+1
166====
167
168The `l='label[score]'` option may be specified more than once to
169apply multiple review labels.
170
171The value is optional. If not specified, it defaults to +1 (if
172the label range allows it).
173
David Ostrovskyd07bb3392015-01-19 07:43:44 +0100174[[change_edit]]
175A change edit can be pushed by specifying the `edit` (or `e`) option on
176the reference:
177
178====
179 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%edit
180====
181
182There is at most one change edit per user and change. In order to push
183a change edit the change must already exist.
184
185[NOTE]
186When a change edit already exists for a change then pushing with
187`%edit` replaces the existing change edit. This option is useful to
188rebase a change edit on the newest patch set when the rebase of the
189change edit in the web UI fails due to conflicts.
190
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800191If you are frequently uploading changes to the same Gerrit server,
192consider adding an SSH host block in `~/.ssh/config` to remember
193your username, hostname and port number. This permits the use of
194shorter URLs on the command line, such as:
195
196====
197 $ cat ~/.ssh/config
198 ...
199 Host tr
200 Hostname git.example.com
201 Port 29418
202 User john.doe
203
204 $ git push tr:kernel/common HEAD:refs/for/experimental
205====
206
Edwin Kempinb5df3b82011-10-10 11:31:14 +0200207Specific reviewers can be requested and/or additional 'carbon
David Pursehouse93733b62014-10-03 12:26:04 +0900208copies' of the notification message may be sent by including the
209`reviewer` (or `r`) and `cc` options in the reference:
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800210
211====
Shawn Pearce69928a62013-02-24 18:01:27 -0800212 git push tr:kernel/common HEAD:refs/for/experimental%r=a@a.com,cc=b@o.com
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800213====
214
Shawn Pearce69928a62013-02-24 18:01:27 -0800215The `r='email'` and `cc='email'` options may be specified as many
216times as necessary to cover all interested parties. Gerrit will
217automatically avoid sending duplicate email notifications, such as
218if one of the specified reviewers or CC addresses had also requested
219to receive all new change notifications.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800220
221If you are frequently sending changes to the same parties and/or
222branches, consider adding a custom remote block to your project's
223`.git/config` file:
224
225====
226 $ cat .git/config
227 ...
Shawn Pearce69928a62013-02-24 18:01:27 -0800228 [remote "exp"]
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800229 url = tr:kernel/common
Shawn Pearce69928a62013-02-24 18:01:27 -0800230 push = HEAD:refs/for/experimental%r=a@a.com,cc=b@o.com
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800231
Shawn Pearce69928a62013-02-24 18:01:27 -0800232 $ git push exp
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800233====
234
235
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700236[[push_replace]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800237=== Replace Changes
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700238
239To add an additional patch set to a change, ensure Change-Id
240lines were created in the original commit messages, and just use
241`git push URL HEAD:refs/for/...` as <<push_create,described above>>.
242Gerrit Code Review will automatically match the commits back to
243their original changes by taking advantage of the Change-Id lines.
244
245If Change-Id lines are not present in the commit messages, consider
246amending the message and copying the line from the change's page
247on the web, and then using `git push` as described above.
248
249If Change-Id lines are not available, then the user must use the
250manual mapping technique described below.
251
252For more about Change-Ids, see link:user-changeid.html[Change-Id Lines].
253
Edwin Kempin930187e2011-01-27 10:13:42 +0100254[[manual_replacement_mapping]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800255==== Manual Replacement Mapping
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700256
David Pursehousea3d53c62014-10-03 12:27:30 +0900257.Note
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700258****
259The remainder of this section describes a manual method of replacing
260changes by matching each commit name to an existing change number.
261End-users should instead prefer to use Change-Id lines in their
262commit messages, as the process is then fully automated by Gerrit
263during normal uploads.
264
265See above for the preferred technique of replacing changes.
266****
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800267
268To add an additional patch set to a change, replacing it with an
269updated version of the same logical modification, send the new
270commit to the change's ref. For example, to add the commit whose
271SHA-1 starts with `c0ffee` as a new patch set for change number
272`1979`, use the push refspec `c0ffee:refs/changes/1979` as below:
273
274====
275 git push ssh://sshusername@hostname:29418/projectname c0ffee:refs/changes/1979
276====
277
278This form can be combined together with `refs/for/'branchname'`
279(above) to simultaneously create new changes and replace changes
280during one network transaction.
281
282For example, consider the following sequence of events:
283
284====
285 $ git commit -m A ; # create 3 commits
286 $ git commit -m B
287 $ git commit -m C
288
289 $ git push ... HEAD:refs/for/master ; # upload for review
290 ... A is 1500 ...
291 ... B is 1501 ...
292 ... C is 1502 ...
293
294 $ git rebase -i HEAD~3 ; # edit "A", insert D before B
295 ; # now series is A'-D-B'-C'
Shawn O. Pearced6078462009-11-02 10:37:01 -0800296 $ git push ...
297 HEAD:refs/for/master
298 HEAD~3:refs/changes/1500
299 HEAD~1:refs/changes/1501
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800300 HEAD~0:refs/changes/1502 ; # upload replacements
301====
302
303At the final step during the push Gerrit will attach A' as a new
304patch set on change 1500; B' as a new patch set on change 1501; C'
305as a new patch set on 1502; and D will be created as a new change.
306
307Ensuring D is created as a new change requires passing the refspec
308`HEAD:refs/for/branchname`, otherwise Gerrit will ignore D and
309won't do anything with it. For this reason it is a good idea to
310always include the create change refspec when uploading replacements.
311
312
Edwin Kempin913eab12011-05-06 08:18:24 +0200313[[bypass_review]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800314=== Bypass Review
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800315
316Changes (and annotated tags) can be pushed directly into a
317repository, bypassing the review process. This is primarily useful
318for a project owner to create new branches, create annotated tags
319for releases, or to force-update a branch whose history needed to
320be rewritten.
321
322Gerrit restricts direct pushes that bypass review to:
323
Jonathan Nieder5758f182015-03-30 11:28:55 -0700324* `+refs/heads/*+`: any branch can be updated, created, deleted,
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800325or rewritten by the pusher.
Jonathan Nieder5758f182015-03-30 11:28:55 -0700326* `+refs/tags/*+`: annotated tag objects pointing to any other type
Nico Sallembien950e4152010-03-16 15:45:33 -0700327of Git object can be created.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800328
Fredrik Luthanderc10f9e72012-01-23 17:00:45 +0100329To push branches, the proper access rights must be configured first.
330Here follows a few examples of how to configure this in Gerrit:
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800331
332* Update: Any existing branch can be fast-forwarded to a new commit.
333This is the safest mode as commits cannot be discarded. Creation
Fredrik Luthanderc10f9e72012-01-23 17:00:45 +0100334of new branches is rejected. Can be configured with
335link:access-control.html#category_push_direct['Push'] access.
336* Create: Allows creation of a new branch if the name does not
337already designate an existing branch name. Needs
338link:access-control.html#category_create['Create Reference']
339configured. Please note that once created, this permission doesn't
340grant the right to update the branch with further commits (see above
341for update details).
342* Delete: Implies Update, but also allows an existing
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800343branch to be deleted. Since a force push is effectively a delete
344followed by a create, but performed atomically on the server and
345logged, this also permits forced push updates to branches.
Fredrik Luthanderc10f9e72012-01-23 17:00:45 +0100346To grant this access, configure
347link:access-control.html#category_push_direct['Push'] with the
348'Force' option ticked.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800349
350To push annotated tags, the `Push Annotated Tag` project right must
351be granted to one (or more) of the user's groups. There is only
352one level of access in this category.
353
354Project owners may wish to grant themselves `Push Annotated Tag`
355only at times when a new release is being prepared, and otherwise
356grant nothing at all. This ensures that accidental pushes don't
357make undesired changes to the public repository.
358
359
Edwin Kempinbfa06212013-04-04 16:06:39 +0200360[[auto_merge]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800361=== Auto-Merge during Push
Edwin Kempinbfa06212013-04-04 16:06:39 +0200362
363Changes can be directly submitted on push. This is primarily useful
364for teams that don't want to do code review but want to use Gerrit's
365submit strategies to handle contention on busy branches. Using
366`%submit` creates a change and submits it immediately, if the caller
367has link:access-control.html#category_submit[Submit] permission on
368`refs/for/<ref>` (e.g. on `refs/for/refs/heads/master`).
369
370====
371 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%submit
372====
373
374On auto-merge of a change neither labels nor submit rules are checked.
375If the merge fails the change stays open, but when pushing a new patch
376set the merge can be reattempted by using `%submit` again.
377
378
Shawn Pearce5d8a2902013-04-22 11:50:23 -0700379[[base]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800380=== Selecting Merge Base
Shawn Pearce5d8a2902013-04-22 11:50:23 -0700381
382By default new changes are opened only for new unique commits
383that have never before been seen by the Gerrit server. Clients
384may override that behavior and force new changes to be created
385by setting the merge base SHA-1 using the '%base' argument:
386
387====
388 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%base=$(git rev-parse origin/master)
389====
390
Sasa Zivkovbc011a12013-11-07 16:08:31 +0100391It is also possible to specify more than one '%base' argument.
392This may be useful when pushing a merge commit. Note that the '%'
393character has only to be provided once, for the first '%base'
394argument:
395
396====
397 git push ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master%base=commit-id1,base=commit-id2
398====
399
Shawn Pearce5d8a2902013-04-22 11:50:23 -0700400
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800401== repo upload
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700402
403repo is a multiple repository management tool, most commonly
404used by the Android Open Source Project. For more details, see
Orgad Shanehc9e11de2012-12-24 16:49:09 +0200405link:http://source.android.com/source/using-repo.html[using repo].
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700406
407[[repo_create]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800408=== Create Changes
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700409
410To upload changes to a project using `repo`, ensure the manifest's
411review field has been configured to point to the Gerrit server.
412Only the hostname or the web address needs to be given in the
413manifest file. During upload `repo` will automatically determine the
414correct port number by reading `http://'reviewhostname'/ssh_info`
415when its invoked.
416
417Each new commit uploaded by `repo upload` will be converted into
418a change record on the server. Other users (e.g. project owners)
419who have configured Gerrit to notify them of new changes will be
420automatically sent an email message. Additional notifications can
421be sent through command line options.
422
423For more details on using `repo upload`, see `repo help upload`.
424
425[[repo_replace]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800426=== Replace Changes
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700427
428To replace changes, ensure Change-Id lines were created in the
Cecilia Svenssoncd2491d2012-01-20 14:22:30 +0100429commit messages, and just use `repo upload`.
430Gerrit Code Review will automatically match the commits back to
431their original changes by taking advantage of their Change-Id lines.
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700432
433If Change-Id lines are not present in the commit messages, consider
434amending the message and copying the line from the change's page
435on the web.
436
437If Change-Id lines are not available, then the user must use the much
Cecilia Svenssoncd2491d2012-01-20 14:22:30 +0100438more <<manual_replacement_mapping,manual mapping technique>> offered
439by using `git push` to a specific `refs/changes/change#` reference.
Shawn O. Pearce518fe3f2009-08-22 15:40:58 -0700440
441For more about Change-Ids, see link:user-changeid.html[Change-Id Lines].
442
443
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800444== Gritty Details
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800445
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800446As Gerrit implements the entire SSH and Git server stack within its
447own process space, Gerrit maintains complete control over how the
448repository is updated, and what responses are sent to the `git push`
449client invoked by the end-user, or by `repo upload`. This allows
Jonathan Nieder5758f182015-03-30 11:28:55 -0700450Gerrit to provide magical refs, such as `+refs/for/*+` for new
451change submission and `+refs/changes/*+` for change replacement.
Shawn O. Pearcee61a3c62009-01-29 08:42:41 -0800452When a push request is received to create a ref in one of these
453namespaces Gerrit performs its own logic to update the database,
454and then lies to the client about the result of the operation.
455A successful result causes the client to believe that Gerrit has
456created the ref, but in reality Gerrit hasn't created the ref at all.
457
458By implementing the entire server stack, Gerrit is also able to
459perform project level access control checks (to verify the end-user
460is permitted to access a project) prior to advertising the available
461refs, and potentially leaking information to a snooping client.
462Clients cannot tell the difference between 'project not found' and
463'project exists, but access is denied'.
464
465Gerrit can also ensure users have completed a valid Contributor
466Agreement prior to accepting any transferred objects, and if an
467agreement is required, but not completed, it aborts the network
468connection before data is sent. This ensures that project owners
469can be certain any object available in their repository has been
470supplied under at least one valid agreement.
Shawn O. Pearce5500e692009-05-28 15:55:01 -0700471
472GERRIT
473------
474Part of link:index.html[Gerrit Code Review]
Yuxuan 'fishy' Wang99cb68d2013-10-31 17:26:00 -0700475
476SEARCHBOX
477---------