:linkattrs:
= Gerrit Code Review - Configuration

== File `etc/gerrit.config`

The optional file `'$site_path'/etc/gerrit.config` is a Git-style
config file that controls many host specific settings for Gerrit.

[NOTE]
The contents of the `etc/gerrit.config` file are cached at startup
by Gerrit. For most properties, if they are modified in this file, Gerrit
needs to be restarted before it will use the new values. Some properties
support being link:#reloadConfig[`reloaded`] without restart.

Sample `etc/gerrit.config`:
----
[core]
  packedGitLimit = 200 m

[cache]
  directory = /var/cache/gerrit
----

[[reloadConfig]]
=== Reload `etc/gerrit.config`
Some properties support being reloaded without restart when a `reload config`
command is issued through link:cmd-reload-config.html[`SSH`] or the
link:rest-api-config.html#reload-config[`REST API`]. If a property supports
this it is specified in the documentation for the property below.


[[accountPatchReviewDb]]
=== Section accountPatchReviewDb

The AccountPatchReviewDb is a database used to store the user file reviewed
flags.

[[accountPatchReviewDb.url]]accountPatchReviewDb.url::
+
The url of accountPatchReviewDb. Supported types are `H2`, `POSTGRESQL`,
`MARIADB`, and `MYSQL`. Drop the driver jar in the lib folder of the site path
if the Jdbc driver of the corresponding Database is not yet in the class path.
+
Default is to create H2 database in the db folder of the site path.
+
Changing this parameter requires to migrate database using the
link:pgm-MigrateAccountPatchReviewDb.html[MigrateAccountPatchReviewDb] program.
Migration cannot be done while the server is running.
+
Also note that the db_name has to be a new db and not reusing an old ReviewDb
database from a former 2.x site, otherwise gerrit's init will remove the table.

----
[accountPatchReviewDb]
  url = jdbc:postgresql://<host>:<port>/<db_name>?user=<user>&password=<password>
----

[[accountPatchReviewDb.poolLimit]]accountPatchReviewDb.poolLimit::
+
Maximum number of open database connections.  If the server needs
more than this number, request processing threads will wait up
to <<accountPatchReviewDb.poolMaxWait, poolMaxWait>> seconds for a
connection to be released before they abort with an exception.
This limit must be several units higher than the total number of
httpd and sshd threads as some request processing code paths may
need multiple connections.
+
Default is <<sshd.threads, sshd.threads>>
 + <<httpd.maxThreads, httpd.maxThreads>> + 2.
+

[[accountPatchReviewDb.poolMinIdle]]database.poolMinIdle::
+
Minimum number of connections to keep idle in the pool.
Default is 4.
+

[[accountPatchReviewDb.poolMaxIdle]]accountPatchReviewDb.poolMaxIdle::
+
Maximum number of connections to keep idle in the pool.  If there
are more idle connections, connections will be closed instead of
being returned back to the pool.
Default is min(<<accountPatchReviewDb.poolLimit, accountPatchReviewDb.poolLimit>>, 16).
+

[[accountPatchReviewDb.poolMaxWait]]accountPatchReviewDb.poolMaxWait::
+
Maximum amount of time a request processing thread will wait to
acquire a database connection from the pool.  If no connection is
released within this time period, the processing thread will abort
its current operations and return an error to the client.
Values should use common unit suffixes to express their setting:
+
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours

+
If a unit suffix is not specified, `milliseconds` is assumed.
Default is `30 seconds`.

[[accounts]]
=== Section accounts

[[accounts.visibility]]accounts.visibility::
+
Controls visibility of other users' dashboard pages and
completion suggestions to web users.
+
If `ALL`, all users are visible to all other users, even
anonymous users.
+
If `SAME_GROUP`, only users who are also members of a group the
current user is a member of are visible.
+
If `VISIBLE_GROUP`, only users who are members of at least one group
that is visible to the current user are visible.
+
If `NONE`, no users other than the current user are visible.
+
Default is `ALL`.

[[accounts.defaultDisplayName]]accounts.defaultDisplayName::
+
If a user account does not have a display name set, which is the normal
case, then this configuration value chooses the strategy how to choose
the display name. Note that this strategy is not applied by the backend.
If the AccountInfo has the display name unset, then the client has to
apply this strategy.
+
If `FULL_NAME`, then the (full) name of the user is chosen from
link:rest-api-accounts.html#account-info[AccountInfo].
+
If `FIRST_NAME`, then the first word (i.e. everything until first
whitespace character) of the (full) name of the user is chosen from
link:rest-api-accounts.html#account-info[AccountInfo].
+
If `USERNAME`, then the username of the user is chosen from
link:rest-api-accounts.html#account-info[AccountInfo]. If that is not
set, then the (full) name will be used.
+
Default is `FULL_NAME`.

[[addreviewer]]
=== Section addreviewer

[[addreviewer.maxWithoutConfirmation]]addreviewer.maxWithoutConfirmation::
+
The maximum number of reviewers a user can add at once by adding a
group as reviewer without being asked to confirm the operation.
+
If set to 0, the user will never be asked to confirm adding a group
as reviewer.
+
Default is 10.
+
This setting only applies for adding reviewers in the Gerrit Web UI,
but is ignored when adding reviewers with the
link:cmd-set-reviewers.html[set-reviewers] command.
+
This value supports link:#reloadConfig[configuration reloads].

[[addreviewer.maxAllowed]]addreviewer.maxAllowed::
+
The maximum number of reviewers a user can add at once by adding a
group as reviewer.
+
If set to 0, there is no limit for the number of reviewers that can
be added at once by adding a group as reviewer.
+
Default is 20.
+
This value supports link:#reloadConfig[configuration reloads].

[[addReviewer.baseWeight]]addReviewer.baseWeight::
+
The weight that will be applied in the default reviewer ranking algorithm.
This can be increased or decreased to give more or less influence to plugins.
If set to zero, the base ranking will not have any effect. Reviewers will then
be ordered as ranked by the plugins (if there are any).
+
By default 1.

[[auth]]
=== Section auth

See also link:config-sso.html[SSO configuration].

[[auth.type]]auth.type::
+
Type of user authentication employed by Gerrit.  The supported
values are:
+
* `OpenID`
+
The default setting.  Gerrit uses any valid OpenID
provider chosen by the end-user.  For more information see
http://openid.net/[openid.net,role=external,window=_blank].
+
* `OpenID_SSO`
+
Supports OpenID from a single provider.  There is no registration
link, and the "Sign In" link sends the user directly to the provider's
SSO entry point.
+
* `HTTP`
+
Gerrit relies upon data presented in the HTTP request.  This includes
HTTP basic authentication, or some types of commercial single-sign-on
solutions.  With this setting enabled the authentication must
take place in the web server or servlet container, and not from
within Gerrit.
+
* `HTTP_LDAP`
+
Exactly like `HTTP` (above), but additionally Gerrit pre-populates
a user's full name and email address based on information obtained
from the user's account object in LDAP.  The user's group membership
is also pulled from LDAP, making any LDAP groups that a user is a
member of available as groups in Gerrit. Hence the `_LDAP` suffix in
the name of this authentication type. Gerrit does NOT authenticate
the user via LDAP.
+
* `CLIENT_SSL_CERT_LDAP`
+
This authentication type is actually kind of SSO. Gerrit will configure
Jetty's SSL channel to request the client's SSL certificate. For this
authentication to work a Gerrit administrator has to import the root
certificate of the trust chain used to issue the client's certificate
into the <review-site>/etc/keystore.
After the authentication is done Gerrit will obtain basic user
registration (name and email) from LDAP, and some group memberships.
Hence the `_LDAP` suffix in the name of this authentication type.
Gerrit does NOT authenticate the user via LDAP.
This authentication type can only be used under hosted daemon mode, and
the httpd.listenUrl must use https:// as the protocol.
Optionally, certificate revocation list file can be used
at <review-site>/etc/crl.pem. For details, see httpd.sslCrl.
+
* `LDAP`
+
Gerrit prompts the user to enter a username and a password, which
it then verifies by performing a simple bind against the configured
<<ldap.server,ldap.server>>.  In this configuration the web server
is not involved in the user authentication process.
+
The actual username used in the LDAP simple bind request is the
account's full DN, which is discovered by first querying the
directory using either an anonymous request, or the configured
<<ldap.username,ldap.username>> identity. Gerrit can also use kerberos if
<<ldap.authentication,ldap.authentication>> is set to `GSSAPI`.
+
If link:#auth.gitBasicAuthPolicy[`auth.gitBasicAuthPolicy`] is set to `HTTP`,
the randomly generated HTTP password is used for authentication. On the other hand,
if link:#auth.gitBasicAuthPolicy[`auth.gitBasicAuthPolicy`] is set to `HTTP_LDAP`,
the password in the request is first checked against the HTTP password and, if
it does not match, it is then validated against the LDAP password.
Service users that are link:cmd-create-account.html[internal-only] are
authenticated by their HTTP passwords.

* `LDAP_BIND`
+
Gerrit prompts the user to enter a username and a password, which
it then verifies by performing a simple bind against the configured
<<ldap.server,ldap.server>>.  In this configuration the web server
is not involved in the user authentication process.
+
Unlike `LDAP` above, the username used to perform the LDAP simple bind
request is the exact string supplied in the dialog by the user.
The configured <<ldap.username,ldap.username>> identity is not used to obtain
account information.
+
* `OAUTH`
+
OAuth is a protocol that lets external apps request authorization to private
details in a user's account without getting their password. This is
preferred over Basic Authentication because tokens can be limited to specific
types of data, and can be revoked by users at any time.
+
Site owners have to register their application before getting started. Note
that provider specific plugins must be used with this authentication scheme.
+
Git clients may send OAuth 2 access tokens instead of passwords in the Basic
authentication header. Note that provider specific plugins must be installed to
facilitate this authentication scheme. If multiple OAuth 2 provider plugins are
installed one of them must be selected as default with the
`auth.gitOAuthProvider` option.
+
* `DEVELOPMENT_BECOME_ANY_ACCOUNT`
+
*DO NOT USE*.  Only for use in a development environment.
+
When this is the configured authentication method a hyperlink titled
`Become` appears in the top right corner of the page, taking the
user to a form where they can enter the username of any existing
user account, and immediately login as that account, without any
authentication taking place.

+
By default, OpenID.

[[auth.allowedOpenID]]auth.allowedOpenID::
+
List of permitted OpenID providers.  A user may only authenticate
with an OpenID that matches this list.  Only used if `auth.type`
is set to `OpenID` (the default).
+
Patterns may be either a
link:http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html[standard
Java regular expression (java.util.regex),role=external,window=_blank] (start with `^` and
end with `$`) or be a simple prefix (any other string).
+
By default, the list contains two values, `http://` and `https://`,
allowing users to authenticate with any OpenID provider.

[[auth.trustedOpenID]]auth.trustedOpenID::
+
List of trusted OpenID providers.  Only used if `auth.type` is
set to `OpenID` (the default).
+
In order for a user to take advantage of permissions beyond those
granted to the `Anonymous Users` and `Registered Users` groups,
the user account must only have OpenIDs which match at least one
pattern from this list.
+
Patterns may be either a
link:http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html[standard
Java regular expression (java.util.regex),role=external,window=_blank] (start with `^` and
end with `$`) or be a simple prefix (any other string).
+
By default, the list contains two values, `http://` and `https://`,
allowing Gerrit to trust any OpenID it receives.

[[auth.openIdDomain]]auth.openIdDomain::
+
List of allowed OpenID email address domains. Only used if
`auth.type` is set to `OPENID` or `OPENID_SSO`.
+
Domain is case insensitive and must be in the same form as it
appears in the email address, for example, "example.com".
+
By default, any domain is accepted.

[[auth.maxOpenIdSessionAge]]auth.maxOpenIdSessionAge::
+
Time in seconds before an OpenID provider must force the user
to authenticate themselves again before authentication to this
Gerrit server.  Currently this is only a polite request, and users
coming from providers that don't support the PAPE extension will
be accepted anyway.  In the future it may be enforced, rejecting
users coming from providers that don't honor the max session age.
+
If set to 0, the provider will always force the user to authenticate
(e.g. supply their password).  Values should use common unit suffixes
to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days
* w, week, weeks (`1 week` is treated as `7 days`)
* mon, month, months (`1 month` is treated as `30 days`)
* y, year, years (`1 year` is treated as `365 days`)

+
Default is -1, permitting infinite time between authentications.

[[auth.registerEmailPrivateKey]]auth.registerEmailPrivateKey::
+
Private key to use when generating an email verification token.
+
If not set, a random key is generated when running the
link:pgm-init.html[site initialization].

[[auth.maxRegisterEmailTokenAge]]auth.maxRegisterEmailTokenAge::
+
Time in seconds before an email verification token sent to a user in
order to validate their email address expires.
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days
* w, week, weeks (`1 week` is treated as `7 days`)
* mon, month, months (`1 month` is treated as `30 days`)
* y, year, years (`1 year` is treated as `365 days`)

+
Default is 12 hours.

[[auth.openIdSsoUrl]]auth.openIdSsoUrl::
+
The SSO entry point URL.  Only used if `auth.type` is set to
`OpenID_SSO`.
+
The "Sign In" link will send users directly to this URL.

[[auth.httpHeader]]auth.httpHeader::
+
HTTP header to trust the username from, or unset to select HTTP basic
authentication.  Only used if `auth.type` is set to `HTTP`.

[[auth.httpDisplaynameHeader]]auth.httpDisplaynameHeader::
+
HTTP header to retrieve the user's display name from.  Only used if `auth.type`
is set to `HTTP`.
+
If set, Gerrit trusts and enforces the user's full name using the HTTP header
and disables the ability to manually modify the user's full name
from the contact information page.

[[auth.httpEmailHeader]]auth.httpEmailHeader::
+
HTTP header to retrieve the user's e-mail from.  Only used if `auth.type`
is set to `HTTP`.
+
If set, Gerrit trusts and enforces the user's e-mail using the HTTP header
and disables the ability to manually modify or register other e-mails
from the contact information page.

[[auth.httpExternalIdHeader]]auth.httpExternalIdHeader::
+
HTTP header to retrieve the user's external identification token.
Only used if `auth.type` is set to `HTTP`.
+
If set, Gerrit adds the value contained in the HTTP header to the
user's identity. Typical use is with a federated identity token from
an external system (e.g. GitHub OAuth 2.0 authentication) where
the user's auth token exchanged during authentication handshake
needs to be used for authenticated communication to the external
system later on.
+
Example: `auth.httpExternalIdHeader: X-GitHub-OTP`

[[auth.loginUrl]]auth.loginUrl::
+
URL to redirect a browser to after the end-user has clicked on the
login link in the upper right corner. Only used if `auth.type` is set
to `HTTP` or `HTTP_LDAP`.
Organizations using an enterprise single-sign-on solution may want to
redirect the browser to the SSO product's sign-in page for completing the
login process and validate their credentials.
+
If set, Gerrit allows anonymous access until the end-user performs the login
and provides a trusted identity through the HTTP header.
If not set, Gerrit requires the HTTP header with a trusted identity
and returns the error page 'LoginRedirect.html' if such a header is not
present.

[[auth.loginText]]auth.loginText::
+
Text displayed in the loginUrl link. Only used if `auth.loginUrl` is set.
+
If not set, the "Sign In" text is used.

[[auth.registerPageUrl]]auth.registerPageUrl::
+
URL of the registration page to use when a new user logs in to Gerrit for
the first time. Used only when `auth.type` is set to `HTTP`.
+
If not set, the standard Gerrit registration page `/#/register/` is displayed.

[[auth.logoutUrl]]auth.logoutUrl::
+
URL to redirect a browser to after the end-user has clicked on the
"Sign Out" link in the upper right corner.  Organizations using an
enterprise single-sign-on solution may want to redirect the browser
to the SSO product's sign-out page.
+
If not set, the redirect returns to the list of all open changes.

[[auth.registerUrl]]auth.registerUrl::
+
Target for the "Register" link in the upper right corner.  Used only
when `auth.type` is `LDAP`, `LDAP_BIND` or `CUSTOM_EXTENSION`.
+
If not set, no "Register" link is displayed.

[[auth.registerText]]auth.registerText::
+
Text for the "Register" link in the upper right corner.  Used only
when `auth.type` is `LDAP`, `LDAP_BIND` or `CUSTOM_EXTENSION`.
+
If not set, defaults to "Register".

[[auth.editFullNameUrl]]auth.editFullNameUrl::
+
Target for the "Edit" button when the user is allowed to edit their
full name.  Used only when `auth.type` is `LDAP`, `LDAP_BIND` or
`CUSTOM_EXTENSION`.

[[auth.httpPasswordUrl]]auth.httpPasswordUrl::
+
Target for the "Obtain Password" link.  Used only when `auth.type` is
`CUSTOM_EXTENSION`.

[[auth.switchAccountUrl]]auth.switchAccountUrl::
+
URL to switch user identities and login as a different account than
the currently active account.  This is disabled by default except when
`auth.type` is `OPENID` and `DEVELOPMENT_BECOME_ANY_ACCOUNT`.  If set
the "Switch Account" link is displayed next to "Sign Out".
+
When `auth.type` does not normally enable this URL administrators may
set this to `login/`, allowing users to begin a new web session. This value
is used as an href in the Gerrit web app, so absolute URLs like
`https://someotherhost/login` work as well.
+
If a ${path} parameter is included, then the Gerrit web app will substitute the
currently viewed path in the link. Be aware that this path will include
a leading slash, so a value like this might be appropriate: `/login${path}`.

[[auth.cookiePath]]auth.cookiePath::
+
Sets "path" attribute of the authentication cookie.
+
If not set, HTTP request's path is used.

[[auth.cookieDomain]]auth.cookieDomain::
+
Sets "domain" attribute of the authentication cookie.
+
If not set, HTTP request's domain is used.

[[auth.cookieSecure]]auth.cookieSecure::
+
Sets "secure" flag of the authentication cookie.  If true, cookies
will be transmitted only over HTTPS protocol.
+
By default, false.

[[auth.emailFormat]]auth.emailFormat::
+
Optional format string to construct user email addresses out of
user login names.  Only used if `auth.type` is `HTTP`, `HTTP_LDAP`
or `LDAP`.
+
This value can be set to a format string, where `{0}` is replaced
with the login name.  E.g. "\{0\}+gerrit@example.com" with a user
login name of "foo" will produce "foo+gerrit@example.com" during
the first time user "foo" registers.
+
If the site is using `HTTP_LDAP` or `LDAP`, using this option is
discouraged.  Setting `ldap.accountEmailAddress` and importing the
email address from the LDAP directory is generally preferred.

[[auth.contributorAgreements]]auth.contributorAgreements::
+
Controls whether or not the contributor agreement features are
enabled for the Gerrit site.  If enabled a user must complete a
contributor agreement before they can upload changes.
+
If enabled, the admin must also add one or more
link:config-cla.html[contributor-agreement sections]
in project.config and create agreement files under
`'$site_path'/static`, so users can actually complete one or
more agreements.
+
By default this is false (no agreements are used).
+
To enable the actual usage of contributor agreement the project
specific config option in the `project.config` must be set:
link:config-project-config.html#receive.requireContributorAgreement[
receive.requireContributorAgreement].

[[auth.trustContainerAuth]]auth.trustContainerAuth::
+
If true then it is the responsibility of the container hosting
Gerrit to authenticate users. In this case Gerrit will blindly trust
the container.
+
This parameter only affects git over http traffic. If set to false
then Gerrit will do the authentication (using Basic authentication).
+
By default this is set to false.


[[auth.gitBasicAuthPolicy]]auth.gitBasicAuthPolicy::
+
When `auth.type` is `LDAP`, `LDAP_BIND` or `OAUTH`, it allows using either the generated
HTTP password, the LDAP or OAUTH password, or a combination of HTTP and LDAP
authentication, to authenticate Git over HTTP and REST API requests.
The supported values are:
+
*`HTTP`
+
Only the HTTP password is accepted when doing Git over HTTP and REST API requests.
+
*`LDAP`
+
Only the `LDAP` password is allowed when doing Git over HTTP and REST API
requests.
+
*`OAUTH`
+
Only the `OAUTH` authentication is allowed when doing Git over HTTP and REST API
requests.
+
*`HTTP_LDAP`
+
The password in the request is first checked against the HTTP password and, if
it does not match, it is then validated against the `LDAP` password.
+
By default this is set to `LDAP` when link:#auth.type[`auth.type`] is `LDAP`
and `OAUTH` when link:#auth.type[`auth.type`] is `OAUTH`.
Otherwise, the default value is `HTTP`.
+
When gitBasicAuthPolicy is set to `LDAP` or `HTTP_LDAP` and the user
is authenticating with the LDAP username/password, the Git client config
needs to have `http.cookieFile` set to a local file, otherwise every
single call would trigger a full LDAP authentication and groups resolution
which could introduce a noticeable latency on the overall execution
and produce unwanted load to the LDAP server.

[[auth.gitOAuthProvider]]auth.gitOAuthProvider::
+
Selects the OAuth 2 provider to authenticate git over HTTP traffic with.
+
In general there is no way to determine from an access token alone, which
OAuth 2 provider to address to verify that token, and the BasicAuth
scheme does not support amending such details. If multiple OAuth provider
plugins in a system offer support for git over HTTP authentication site
administrators must configure, which one to use as default provider.
In case the provider cannot be determined from a request the access token
will be sent to the default provider for verification.
+
The value of this parameter must be the identifier of an OAuth 2 provider
in the form `plugin-name:provider-name`. Consult the respective plugin
documentation for details.

[[auth.userNameToLowerCase]]auth.userNameToLowerCase::
+
If set the username that is received to authenticate a git operation
is converted to lower case for looking up the user account in Gerrit.
+
By setting this parameter a case insensitive authentication for the
git operations can be achieved, if it is ensured that the usernames in
Gerrit (scheme `username`) are stored in lower case (e.g. if the
parameter link:#ldap.accountSshUserName[ldap.accountSshUserName] is
set to `${sAMAccountName.toLowerCase}`). It is important that for all
existing accounts this username is already in lower case. It is not
possible to convert the usernames of the existing accounts to lower
case because this would break the access to existing per-user
branches and Gerrit provides no tool to do such a conversion. Accounts
created using the REST API or the `create-account` SSH command will
be created with all lowercase characters, when this option is set.
+
Setting this parameter to `true` will prevent all users from login that
have a non-lower-case username.
+
This parameter only affects git over http and git over SSH traffic.
+
By default this is set to false.

[[auth.userNameCaseInsensitive]]auth.userNameCaseInsensitive::
+
If set the username will be handled case insensitively but case preserving,
i.e. a user can login with `johndoe` or `JohnDoe` for the same account
created for `JohnDoe`. The form of the username used during account creation
will be used wherever the username is displayed. Sandbox branches created
for a user can also only be created for this original form.
+
Note, that this does not work for all existing accounts, if they were
not originally created with all lowercase, since the note keys of the
external IDs will not match the new scheme. For more details refer to
the link:config-accounts.html#external-ids[External ID documentation].
+
Gerrit provides the
link:pgm-ChangeExternalIdCaseSensitivity.html[offline]
and the online link:externalid-case-insensitivity.html#online-migration[online]
tools to migrate existing accounts to match the new scheme.
+
Naturally, if there were two accounts only different in capitalization,
e.g. `johndoe` and `JohnDoe`, the account `JohnDoe` will not be able
to authenticate anymore after setting this option. If such duplicate
accounts exist the migration tool will fail, since the newly computed
note name would be identical and thus conflict. These duplicates thus
have to be deleted manually by deleting the respective external ID.
+
For newly initialized sites this option defaults to true.
+
Default is false.

[[auth.userNameCaseInsensitiveMigrationMode]]auth.userNameCaseInsensitiveMigrationMode::
+
Setting migration mode to true allows to fallback to case sensitive
behaviour if the migrated external ID cannot be found. This allows to
trigger the migration while Gerrit process is running.
+
Default is false.

[[auth.enableRunAs]]auth.enableRunAs::
+
If true HTTP REST APIs will accept the `X-Gerrit-RunAs` HTTP request
header from any users granted the link:access-control.html#capability_runAs[Run As]
capability. The header and capability permit the authenticated user
to impersonate another account.
+
If false the feature is disabled and cannot be re-enabled without
editing gerrit.config and restarting the server.
+
Default is true.

[[auth.allowRegisterNewEmail]]auth.allowRegisterNewEmail::
+
Whether users are allowed to register new email addresses.
+
In addition for the HTTP authentication type
link:#auth.httpemailheader[auth.httpemailheader] must *not* be set to
enable registration of new email addresses.
+
By default, true.

[[auth.autoUpdateAccountActiveStatus]]auth.autoUpdateAccountActiveStatus::
+
Whether to allow automatic synchronization of an account's inactive flag upon login.
+
If set to true, upon login, if the authentication back-end reports the account as active,
the account's inactive flag in NoteDb will be updated to be active.
+
If the authentication back-end reports the account as inactive, the account's flag will be
updated to be inactive and the login attempt will be blocked. Users enabling this feature
should ensure that their authentication back-end is supported. Currently, only
strict 'LDAP' authentication is supported.
+
In addition, if this parameter is not set, or false, the corresponding scheduled
task to deactivate inactive Gerrit accounts will also be disabled. If this
parameter is set to true, users should also consider configuring the
link:#accountDeactivation[accountDeactivation] section appropriately.
+
By default, false.

[[auth.skipFullRefEvaluationIfAllRefsAreVisible]]auth.skipFullRefEvaluationIfAllRefsAreVisible::
+
Whether to skip the full ref visibility checks as a performance shortcut when a
user has READ permission for all refs.
+
The full ref filtering would filter out refs for pending edits, private changes
and auto merge commits.
+
By default, true.

[[cache]]
=== Section cache

[[cache.threads]]cache.threads::
+
Number of threads to use when running asynchronous cache tasks.
The threads executor is delegated to when sending removal notifications to listeners,
when asynchronous computations like refresh, refreshAfterWrite are performed, or when
performing periodic maintenance.
+
**NOTE**: Setting it to 0 disables the dedicated thread pool and indexing will be done in the
same thread as the operation. This may result in evictions taking longer because the
listeners are executed in the caller's thread.
+
By default, the JVM common ForkJoinPool is used.

[[cache.directory]]cache.directory::
+
Path to a local directory where Gerrit can write cached entities for
future lookup.  This local disk cache is used to retain potentially
expensive to compute information across restarts.  If the location
does not exist, Gerrit will try to create it.
+
Technically, cached entities are persisted as a set of H2 databases
inside this directory.
+
If not absolute, the path is resolved relative to `$site_path`.
+
Default is unset, no disk cache.

[[cache.enableDiskStatMetrics]]cache.enableDiskStatMetrics::
+
Whether to enable the computation of disk statistics of persistent caches.
This computation is expensive and requires a long time on larger installations.
+
By default, false.

[[cache.h2CacheSize]]cache.h2CacheSize::
+
The size of the in-memory cache for each opened H2 cache database, in bytes.
+
Some caches of Gerrit are persistent and are backed by an H2 database.
H2 uses memory to cache its database content. The parameter `h2CacheSize`
allows to limit the memory used by H2 and thus prevent out-of-memory
caused by the H2 database using too much memory.
+
Technically the H2 cache size is configured using the CACHE_SIZE parameter in
the H2 JDBC connection URL, as described
link:http://www.h2database.com/html/features.html#cache_settings[here,role=external,window=_blank]
+
Default is unset, using up to half of the available memory.
+
H2 will persist this value in the database, so to unset explicitly specify 0.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[cache.h2AutoServer]]cache.h2AutoServer::
+
If set to true, enable H2 autoserver mode for the H2-backed persistent cache
databases.
+
See link:http://www.h2database.com/html/features.html#auto_mixed_mode[here,role=external,window=_blank]
for detail.
+
Default is false.

[[cache.openFiles]]cache.openFiles::
+
The number of file descriptors to add to the limit set by the Gerrit daemon.
+
Persistent caches are stored on the file system and as such participate in the
file descriptors utilization. The number of file descriptors can vary depending
on the cache configuration and the specific backend used.
+
The additional file descriptors required by the cache should be accounted for
via this setting, so that the Gerrit daemon can adjust the ulimit accordingly.
+
If you increase this to a larger setting you may need to also adjust
the ulimit on file descriptors for the host JVM, as Gerrit needs
additional file descriptors available for network sockets and other
repository data manipulation.
+
Default is 0.

[[cache.name.maxAge]]cache.<name>.maxAge::
+
Maximum age to keep an entry in the cache. Entries are removed from
the cache and refreshed from source data every maxAge interval.
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days
* w, week, weeks (`1 week` is treated as `7 days`)
* mon, month, months (`1 month` is treated as `30 days`)
* y, year, years (`1 year` is treated as `365 days`)

+
--
If a unit suffix is not specified, `seconds` is assumed.  If 0 is
supplied, the maximum age is infinite and items are never purged
except when the cache is full.

Default is `0`, meaning store forever with no expire, except:

* `"adv_bases"`: default is `10 minutes`
* `"ldap_groups"`: default is `1 hour`
* `"web_sessions"`: default is `12 hours`
--

[[cache.name.memoryLimit]]cache.<name>.memoryLimit::
+
The total cost of entries to retain in memory. The cost computation
varies by the cache. For most caches where the in-memory size of each
entry is relatively the same, memoryLimit is currently defined to be
the number of entries held by the cache (each entry costs 1).
+
For caches where the size of an entry can vary significantly between individual
entries (notably `"git_modified_files"`, `"modified_files"`, `"git_file_diff"`,
`"gerrit_file_diff"`, `"diff_intraline"`), memoryLimit is an approximation of
the total number of bytes stored by the cache.  Larger entries that represent
bigger patch sets or longer source files will consume a bigger portion of the
memoryLimit. For these caches the memoryLimit should be set to roughly the
amount of RAM (in bytes) the administrator can dedicate to the cache.
+
Default is 1024 for most caches, except:
+
* `"adv_bases"`: default is `4096`
* `"git_modified_files"`: default is `10m` (10 MiB of memory)
* `"modified_files"`: default is `10m` (10 MiB of memory)
* `"git_file_diff"`: default is `10m` (10 MiB of memory)
* `"gerrit_file_diff"`: default is `10m` (10 MiB of memory)
* `"diff_intraline"`: default is `10m` (10 MiB of memory)
* `"diff_summary"`: default is `10m` (10 MiB of memory)
* `"external_ids_map"`: default is `2` and should not be changed
* `"groups"`: default is unlimited
* `"groups_byname"`: default is unlimited
* `"groups_byuuid"`: default is unlimited
* `"groups_byuuid_persisted"`: default is `1g` (1 GiB of disk space)
* `"plugin_resources"`: default is 2m (2 MiB of memory)

+
If set to 0 the cache is disabled; entries are loaded but not stored
in-memory.
+
**NOTE**: When the cache is disabled, there is no locking when accessing
the same key/value, and therefore multiple threads may
load the same value concurrently with a higher memory footprint.
To keep a minimum caching and avoid concurrent loading of the same
key/value, set `memoryLimit` to `1` and `maxAge` to `1`.

[[cache.name.expireFromMemoryAfterAccess]]cache.<name>.expireFromMemoryAfterAccess::
+
Time after last access to automatically expire entries from an in-memory
cache. If 0 or not specified, entries are never expired in this manner.
Values may use unit suffixes as in link:#cache.name.maxAge[maxAge].
+
This option only applies to in-memory caches; persistent cache values are
not expired in this manner, and are only pruned via
link:#cache.name.diskLimit[diskLimit].

[[cache.name.diskLimit]]cache.<name>.diskLimit::
+
Total size in bytes of the keys and values stored on disk. Caches that
have grown bigger than this size are scanned daily at 1 AM local
server time to trim the cache. Entries are removed in least recently
accessed order until the cache fits within this limit.  Caches may
grow larger than this during the day, as the size check is only
performed once every 24 hours.
+
Default is 128 MiB per cache, except:
+
* `"change_notes"`: disk storage is disabled by default
* `"diff_summary"`: default is `1g` (1 GiB of disk space)
* `"external_ids_map"`: disk storage is disabled by default
* `"persisted_projects"`: default is `1g` (1 GiB of disk space)

+
If 0 or negative, disk storage for the cache is disabled.

[[cache.name.expireAfterWrite]]cache.<name>.expireAfterWrite::
+
Duration after which a cached value will be evicted and not
read anymore.
+
Values should use common unit suffixes to express their setting:
+
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
+
Disabled by default.

[[cache.name.refreshAfterWrite]]cache.<name>.refreshAfterWrite::
+
Duration after which we asynchronously refresh the cached value.
+
Values should use common unit suffixes to express their setting:
+
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
+
This applies only to these caches that support refreshing:
+
* `"projects"`: Caching project information in-memory. Defaults to 15 minutes.

[[cache.refreshThreadPoolSize]]cache.refreshThreadPoolSize::
+
Number of threads that are available to refresh cached values that became
out of date. This applies only to these caches that support refreshing:
+
* `"projects"`: Caching project information in-memory
+
Refreshes will only be scheduled on this executor if the values are
out of sync.
The check if they are is cheap and always happens on the thread that
inquires for a cached value.
+
Defaults to 2.

==== [[cache_names]]Standard Caches

cache `"accounts"`::
+
Cache entries contain important details of an active user, including
their display name, preferences, and known email addresses. Entry
information is obtained from NoteDb data in the `All-Users` repo.

+
If direct updates are made to `All-Users`, this cache should be flushed.

cache `"adv_bases"`::
+
Used only for push over smart HTTP when branch level access controls
are enabled.  The cache entry contains all commits that are available
for the client to use as potential delta bases.  Push over smart HTTP
requires two HTTP requests, and this cache tries to carry state from
the first request into the second to ensure it can complete.

cache `"default_preferences"`::
+
Caches the server's default general, edit and diff preferences.
+
Default value is 1 to hold only the most current version in-memory.

cache `"changes"`::
+
The size of `memoryLimit` determines the number of projects for which
all changes will be cached. If the cache is set to 1024, this means all
changes for up to 1024 projects can be held in the cache.
+
Default value is 0 (disabled). It is disabled by default due to the fact
that change updates are not communicated between Gerrit servers. Hence
this cache should be disabled in a cluster setup using multiple primary
or multiple replica nodes.
+
The cache should be flushed whenever NoteDb change metadata in a repository is
modified outside of Gerrit.

cache `"git_modified_files"`::
+
Each item caches the list of git modified files between two git trees
corresponding to two different commits. This cache does not read the actual
file contents nor does it include the edits (modified regions) of the files.

cache `"modified_files"`::
+
Each item caches the list of modified files between two commits. This cache
is similar to the `git_modified_files` cache but performs extra logic including
filtering out files that are untouched by both commits because they were purely
modified between the parent commits.

cache `"git_file_diff"`::
+
Each item caches the pure git diff between two git trees for a specific file
path. The diff includes all the file attributes (old/new paths, change/patch
types) as well as the list of edits corresponding to the modified regions in
the file.

cache `"gerrit_file_diff"`::
+
Each item caches the diff between two git commits for a specific file path.
This cache is similar to the `git_file_diff` cache but performs extra logic
including identifying the edits that are due to rebase. The diff for the
"commit message" and "merge list" can also be requested from this cache.
+
Entries in this cache are relatively large, so memoryLimit is an
estimate in bytes of memory used. Administrators should try to target
cache.diff.memoryLimit to fit all changes users will view in a 1 or 2
day span. The same applies for other diff caches: `"git_modified_files"`,
`"modified_files"` and `"git_file_diff"`.

cache `"diff_intraline"`::
+
Each item caches the intraline difference of one file, when compared
between two commits. Gerrit uses this cache to accelerate display of
intraline differences when viewing a file.
+
Entries in this cache are relatively large, so memoryLimit is an
estimate in bytes of memory used. Administrators should try to target
cache.diff.memoryLimit to fit all files users will view in a 1 or 2
day span.

cache `"diff_summary"`::
+
Each item caches list of file paths which are different between two
commits. Gerrit uses this cache to accelerate computing of the list
of paths of changed files.
+
Ideally, disk limit of this cache is large enough to cover all changes.
This should significantly speed up change reindexing, especially
full offline reindexing.

cache `"external_ids_map"`::
+
A singleton cache whose sole entry is a map of the parsed representation
of link:config-accounts.html#external-ids[all current external IDs]. The
cache may temporarily contain 2 entries, but the second one is promptly
expired.
+
It is not recommended to change the in-memory attributes of this cache
away from the defaults. The cache may be persisted by setting
`diskLimit`, which is only recommended if cold start performance is
problematic.

cache `"git_tags"`::
+
If branch or reference level READ access controls are used, this
cache tracks which tags are reachable from the branch tips of a
repository.  Gerrit uses this information to determine the set
of tags that a client may access, derived from which tags are
part of the history of a visible branch.
+
The cache is persisted to disk across server restarts as it can
be expensive to compute (60 or more seconds for a large history
like the Linux kernel repository).

cache `"comment_context"`::
+
Caches the context lines of comments, which are the lines of the source file
highlighted by the user when the comment was written.

cache `"groups"`::
+
Caches the basic group information of internal groups by group ID,
including the group owner, name, and description.
+
For this cache it is important to configure a size that is larger than
the number of internal Gerrit groups, otherwise general Gerrit
performance may be poor. This is why by default this cache is
unlimited.
+
External group membership obtained from LDAP is cached under
`"ldap_groups"`.

cache `"groups_byname"`::
+
Caches the basic group information of internal groups by group name,
including the group owner, name, and description.
+
For this cache it is important to configure a size that is larger than
the number of internal Gerrit groups, otherwise general Gerrit
performance may be poor. This is why by default this cache is
unlimited.
+
External group membership obtained from LDAP is cached under
`"ldap_groups"`.

cache `"groups_byuuid"`::
+
Caches the basic group information of internal groups by group UUID,
including the group owner, name, and description.
+
For this cache it is important to configure a size that is larger than
the number of internal Gerrit groups, otherwise general Gerrit
performance may be poor. This is why by default this cache is
unlimited.
+
External group membership obtained from LDAP is cached under
`"ldap_groups"`.

cache `"groups_byuuid_persisted"`::
+
Caches the basic group information of internal groups by group UUID,
including the group owner, name, and description.
+
This is the persisted version of `groups_byuuid` cache. The intention of this
cache is to have an in-memory size of 0.
+
External group membership obtained from LDAP is cached under
`"ldap_groups"`.

cache `"groups_bymember"`::
+
Caches the groups which contain a specific member (account). If direct
updates are made to the `account_group_members` table, this cache should
be flushed.

cache `"groups_bysubgroups"`::
+
Caches the parent groups of a subgroup.  If direct updates are made
to the `account_group_includes` table, this cache should be flushed.

cache `"groups_external"`::
+
Caches all the external groups available to Gerrit. The cache holds a
single entry which maps to the latest available of all external groups'
UUIDs. This cache uses "groups_external_persisted" to load its value.

cache `"groups_external_persisted"`::
+
Caches all external groups available to Gerrit at some point in history.
The cache key is representation of a specific groups state in NoteDb and
the value is the list of all external groups.
The cache is persisted to enhance performance.

cache `"ldap_groups"`::
+
Caches the LDAP groups that a user belongs to, if LDAP has been
configured on this server.  This cache should be configured with a
low maxAge setting, to ensure LDAP modifications are picked up in
a timely fashion.

cache `"ldap_groups_byinclude"`::
+
Caches the hierarchical structure of LDAP groups.

cache `"ldap_usernames"`::
+
Caches a mapping of LDAP username to Gerrit account identity.  The
cache automatically updates when a user first creates their account
within Gerrit, so the cache expire time is largely irrelevant.

cache `"permission_sort"`::
+
Caches the order in which access control sections must be applied to a
reference.  Sorting the sections can be expensive when regular
expressions are used, so this cache remembers the ordering for
each branch.

cache `"plugin_resources"`::
+
Caches formatted plugin resources, such as plugin documentation that
has been converted from Markdown to HTML. The memoryLimit refers to
the bytes of memory dedicated to storing the documentation.

cache `"persisted_projects"`::
+
Caches the project description records, from the `refs/meta/config`
branch of each project. This is the persisted variant of the
`projects` cache. The intention is for this cache to have an in-memory
size of 0.

cache `"projects"`::
+
Caches the project description records, from the `refs/meta/config`
branch of each project. If a project record is updated or deleted, this
cache should be flushed.  Newly inserted projects do not require
a cache flush, as they will be read upon first reference.

cache `"prolog_rules"`::
+
Caches parsed `rules.pl` contents for each project. This cache uses the same
size as the `projects` cache when `cache.prolog_rules.memoryLimit` is not set.

cache `"pure_revert"`::
+
Result of checking if one change or commit is a pure/clean revert of
another.

cache `"soy_sauce_compiled_templates"`::
+
Caches compiled soy templates. Stores at most only one key-value pair with
a constant key value and the value is a compiled SoySauce templates. The value
is reloaded automatically every few seconds if there are reads from the cache.
If cache is not used for 1 minute, the item is removed (i.e. emails can be send
with templates which are max 1 minute old).

cache `"sshkeys"`::
+
Caches unpacked versions of user SSH keys, so the internal SSH daemon
can match against them during authentication.  The unit of storage
is per-user, so 1024 items translates to 1024 unique user accounts.
As each individual user account may configure multiple SSH keys,
the total number of keys may be larger than the item count.

cache `"web_sessions"`::
+
Tracks the live user sessions coming in over HTTP.  Flushing this
cache would cause all users to be signed out immediately, forcing
them to sign-in again.  To avoid breaking active users, this cache
is not flushed automatically by `gerrit flush-caches --all`, but
instead must be explicitly requested.
+
If no disk cache is configured (or `cache.web_sessions.diskLimit`
is set to 0) a server restart will force all users to sign-out,
and need to sign-in again after the restart, as the cache was
unable to persist the session information.  Enabling a disk cache
is strongly recommended.
+
Session storage is relatively inexpensive. The average entry in
this cache is approximately 346 bytes.

See also link:cmd-flush-caches.html[gerrit flush-caches].

==== [[cache_options]]Cache Options

[[cache.git_file_diff.timeout]]cache.git_file_diff.timeout::
+
Maximum number of milliseconds to wait for git diff data before giving up and
falling back on a simpler diff algorithm that will not be able to break down
modified regions into smaller ones. This is a work around for an infinite loop
bug in the default difference algorithm implementation.
+
Values should use common unit suffixes to express their setting:
+
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours

+
--
If a unit suffix is not specified, `milliseconds` is assumed.

Default is 5 seconds.
--

[[cache.diff_intraline.timeout]]cache.diff_intraline.timeout::
+
Maximum number of milliseconds to wait for intraline difference data
before giving up and disabling it for a particular file pair.  This is
a work around for an infinite loop bug in the intraline difference
implementation.
+
If computation takes longer than the timeout, the worker thread is
terminated, an error message is shown, and no intraline difference is
displayed for the file pair.
+
Values should use common unit suffixes to express their setting:
+
* ms, milliseconds
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours

+
--
If a unit suffix is not specified, `milliseconds` is assumed.

Default is 5 seconds.
--

[[cache.diff_intraline.enabled]]cache.diff_intraline.enabled::
+
Boolean to enable or disable the computation of intraline differences
when populating a diff cache entry.  This flag is provided primarily
as a backdoor to disable the intraline difference feature if
necessary.  To maintain backwards compatibility with prior versions,
this setting will fallback to `cache.diff.intraline` if not set in the
configuration.
+
Default is true, enabled.

[[cache.projects.loadOnStartup]]cache.projects.loadOnStartup::
+
If the project cache should be loaded during server startup.
+
The cache is loaded concurrently. Admins should ensure that the cache
size set under <<cache.name.memoryLimit,cache.projects.memoryLimit>>
is not smaller than the number of repos.
+
Default is false, disabled.

[[cache.projects.loadThreads]]cache.projects.loadThreads::
+
Only relevant if <<cache.projects.loadOnStartup,cache.projects.loadOnStartup>>
is true.
+
The number of threads to allocate for loading the cache at startup. These
threads will die out after the cache is loaded.
+
Default is the number of CPUs.

[[cache.project_list.interval]]cache.project_list.interval::
+
The link:#schedule-configuration-interval[interval] for running
the project_list cache warmer.

By default, if `cache.project_list.maxAge` is set, `interval` will be set to
half its value. If `cache.project_list.maxAge` is not set or `interval` is set
to `-1`, it is disabled.

[[cache.project_list.startTime]]cache.project_list.startTime::
+
The link:#schedule-configuration-startTime[start time] for running
the project_list cache warmer.

Default is 00:00 if the project_list cache warmer is enabled.

[[capability]]
=== Section capability

[[capability.administrateServer]]capability.administrateServer::
+
Names of groups of users that are allowed to exercise the
`administrateServer` capability, in addition to those listed in
All-Projects. Configuring this option can be a useful fail-safe
to recover a server in the event an administrator removed all
groups from the `administrateServer` capability, or to ensure that
specific groups always have administration capabilities.
+
----
[capability]
  administrateServer = group Fail Safe Admins
----
+
The configuration file uses group names, not UUIDs.  If a group is
renamed the gerrit.config file must be updated to reflect the new
name. If a group cannot be found for the configured name a warning
is logged and the server will continue normal startup.
+
If not specified (default), only the groups listed by All-Projects
may use the `administrateServer` capability.

[[capability.makeFirstUserAdmin]]capability.makeFirstUserAdmin::
+
Whether the first user that logs in to the Gerrit server should
automatically be added to the administrator group and hence get the
`administrateServer` capability assigned. This is useful to bootstrap
the link:config-accounts.html[account data].
+
Default is true.


[[change]]
=== Section change

[[change.allowBlame]]change.allowBlame::
+
Allow blame on side by side diff. If set to false, blame cannot be used.
+
Default is true.

[[change.cacheAutomerge]]change.cacheAutomerge::
+
When reviewing merge commits, the left-hand side shows the output of the result
of JGit's automatic merge algorithm. This option controls whether this output is
cached in the change repository, or if only the diff is cached in the persistent
diff caches (`"git_modified_files"`, `modified_files`, `"git_file_diff"`,
`"file_diff"`).
+
If true, automerge results are stored in the repository under
`refs/cache-automerge/*`; the results of diffing the change against its
automerge base are stored in the diff caches. If false, no extra data is
stored in the repository, only the diff caches. This can result in slight
performance improvements by reducing the number of refs in the repo.
+
Default is true.

[[change.commentSizeLimit]]change.commentSizeLimit::
+
Maximum allowed size in characters of a regular (non-robot) comment. Comments
which exceed this size will be rejected. Size computation is approximate and may
be off by roughly 1%. Common unit suffixes of 'k', 'm', or 'g' are supported.
The value must be positive.
+
The default limit is 16kiB.

[[change.cumulativeCommentSizeLimit]]change.cumulativeCommentSizeLimit::
+
Maximum allowed size in characters of all comments (including robot comments)
and change messages. Size computation is approximate and may be off by roughly
1%. Common unit suffixes of 'k', 'm', or 'g' are supported.
+
The default limit is 3MiB.

[[change.disablePrivateChanges]]change.disablePrivateChanges::
+
If set to true, users are not allowed to create private changes.
+
The default is false.

[[change.maxComments]]change.maxComments::
+
Maximum number of comments (regular plus robot) allowed per change. Additional
comments are rejected.
+
By default 5,000.

[[change.maxFiles]]change.maxFiles::
+
Maximum number of files allowed per change. Larger changes are rejected and must
be split up.
+
By default 100,000.

[[change.maxPatchSets]]change.maxPatchSets::
+
Maximum number of patch sets allowed per change. If this is insufficient,
recreate the change with a new Change-Id, then abandon the old change.
+
By default 1000.

[[change.maxUpdates]]change.maxUpdates::
+
Maximum number of updates to a change. Counts only updates to the main NoteDb
meta ref; draft comments, robot comments, stars, etc. do not count towards the
total.
+
Many NoteDb operations require walking the entire change meta ref and loading
its contents into memory, so changes with arbitrarily many updates may cause
high CPU usage, memory pressure, persistent cache bloat, and other problems.
+
The following operations are allowed even when a change is at the limit:

* Abandon
* Submit
* Submit by push with `%submit`
* Auto-close by pushing directly to the branch
* Fix with link:rest-api-changes.html#fix-input[`expect_merged_as`]

By default 1000.

[[change.mergeabilityComputationBehavior]]change.mergeabilityComputationBehavior::
+
This setting determines when Gerrit computes if a change is mergeable or not.
This computation is expensive, especially when the repository is large or when
there are many open changes.
+
This config can have the following states:
+
* `API_REF_UPDATED_AND_CHANGE_REINDEX`: Gerrit indexes `mergeability` enabling
  the `is:mergeable` predicate in change search and allowing fast retrieval of
  this bit in query responses. Gerrit will always serve `mergeable` in
  link:rest-api-changes.html#change-info[ChangeInfo] objects.
  Gerrit will reindex all open changes when the target ref advances (expensive).
* `REF_UPDATED_AND_CHANGE_REINDEX`: Gerrit indexes `mergeability` enabling the
  `is:mergeable` predicate in change search and allowing fast retrieval of this
  bit in query responses. Gerrit will never serve `mergeable` in
  link:rest-api-changes.html#change-info[ChangeInfo]
  objects. This state can be a final state for instances that only want to
  optimize the read path, but not the write path for speed or serve as an
  intermediary step for instances that want to optimize both and need to migrate
  callers of their API.
  Gerrit will reindex all open changes when the target ref advances (expensive).
* `NEVER`: Gerrit does not index `mergeable`, so `is:mergeable` is disabled as
  query operator. Gerrit does not serve `mergeable` in
  link:rest-api-changes.html#change-info[ChangeInfo].

NOTE: Gerrit would only render conflict changes section on change
screen if `API_REF_UPDATED_AND_CHANGE_REINDEX` value is set.

Default is `NEVER`.

[[change.conflictsPredicateEnabled]]change.conflictsPredicateEnabled::

+
This setting determines when Gerrit renders conflict changes section on change
screen and also supports `conflicts` predicate. This computation is expensive,
computing ConflictsPredicate has a runtime complexity of O(nˆ2) with n number
of open changes on a branch. When set to false GUI will silently ignore the
error message and leave the conflict changes section on change screen empty.
See also implications on rendering of conflict changes section in configuration
section:link:#change.mergeabilityComputationBehavior[change.mergeabilityComputationBehavior].

Default is true.

[[change.maxSubmittableAtOnce]]change.maxSubmittableAtOnce::
+
Maximum number of changes that can be chained together in the same repository
to be submitted at once.
+
Default is 32767.

[[change.move]]change.move::
+
Whether the link:rest-api-changes.html#move-change[Move Change] REST
endpoint is enabled.
+
The move change functionality has some corner cases with undesired side
effects. Hence administrators may decide to disable this functionality.
In particular, if a change that has dependencies on other changes is
moved to a new branch, and the moved change gets submitted to the new
branch, the changes on which the change depends are silently merged
into the new branch, although these changes have not been moved to that
branch (see details in
link:https://bugs.chromium.org/p/gerrit/issues/detail?id=9877[issue
9877]).
+
By default true.

[[change.robotCommentSizeLimit]]change.robotCommentSizeLimit::
+
Maximum allowed size in characters of a robot comment. Robot comments which
exceed this size will be rejected on addition. Size computation is approximate
and may be off by roughly 1%. Common unit suffixes of 'k', 'm', or 'g' are
supported. Zero or negative values allow robot comments of unlimited size.
+
The default limit is 1MiB.

[[change.sendNewPatchsetEmails]]change.sendNewPatchsetEmails::
+
When false, emails will not be sent to owners, reviewers, and cc for
creating a new patchset unless they are project watchers or have starred
the change.
+
Default is true.

[[change.showAssigneeInChangesTable]]change.showAssigneeInChangesTable::
+
Show assignee field in changes table. If set to false, assignees will
not be visible in changes table.
+
Default is false.

[[change.strictLabels]]change.strictLabels::
+
Reject invalid label votes: invalid labels or invalid values. This
configuration option is provided for backwards compatibility and may
be removed in future gerrit versions.
+
Default is false.

[[change.submitLabel]]change.submitLabel::
+
Label name for the submit button.
+
Default is "Submit".

[[change.submitLabelWithParents]]change.submitLabelWithParents::
+
Label name for the submit button if the change has parents which will
be submitted together with this change.
+
Default is "Submit including parents".

[[change.submitTooltip]]change.submitTooltip::
+
Tooltip for the submit button.  Variables available for replacement
include `${patchSet}` for the current patch set number (1, 2, 3),
`${branch}` for the branch name ("master") and `${commit}` for the
abbreviated commit SHA-1 (`c9c0edb`).
+
Default is "Submit patch set ${patchSet} into ${branch}".

[[change.submitTooltipAncestors]]change.submitTooltipAncestors::
+
Tooltip for the submit button if there are ancestors which would
also be submitted by submitting the change. Additionally to the variables
as in link:#change.submitTooltip[change.submitTooltip], there is the
variable `${submitSize}` indicating the number of changes which are
submitted.
+
Default is "Submit all ${topicSize} changes of the same topic (${submitSize}
changes including ancestors and other changes related by topic)".

[[change.submitTopicLabel]]change.submitTopicLabel::
+
If `change.submitWholeTopic` is set and a change has a topic,
the label name for the submit button is given here instead of
the configuration `change.submitLabel`.
+
Defaults to "Submit whole topic"

[[change.submitTopicTooltip]]change.submitTopicTooltip::
+
If `change.submitWholeTopic` is configured to true and a change has a
topic, this configuration determines the tooltip for the submit button
instead of `change.submitTooltip`. The variable `${topicSize}` is available
for the number of changes in the same topic to be submitted. The number of
all changes to be submitted is in the variable `${submitSize}`.
+
Defaults to "Submit all ${topicSize} changes of the same topic
(${submitSize} changes including ancestors and other
changes related by topic)".

[[change.submitWholeTopic]]change.submitWholeTopic::
+
Determines if the submit button submits the whole topic instead of
just the current change.
+
Default is false.

[[change.updateDelay]]change.updateDelay::
+
How often in seconds the web interface should poll for updates to the
currently open change.  The poller relies on the client's browser
cache to use If-Modified-Since and respect `304 Not Modified` HTTP
responses.  This allows for fast polls, often under 8 milliseconds.
+
With a configured 30 second delay a server with 4900 active users will
typically need to dedicate 1 CPU to the update check.  4900 users
divided by an average delay of 30 seconds is 163 requests arriving per
second.  If requests are served at \~6 ms response time, 1 CPU is
necessary to keep up with the update request traffic.  On a smaller
user base of 500 active users, the default 30 second delay is only 17
requests per second and requires ~10% CPU.
+
If 0 the update polling is disabled.
+
Default is 5 minutes.

[[changeCleanup]]
=== Section changeCleanup

This section allows to configure change cleanups and schedules them to
run periodically.

[[changeCleanup.abandonAfter]]changeCleanup.abandonAfter::
+
Period of inactivity after which open changes should be abandoned
automatically.
+
By default `0`, never abandon open changes.
+
[WARNING] Auto-Abandoning changes may confuse/annoy users. When
enabling this, make sure to choose a reasonably large grace period and
inform users in advance.
+
The following suffixes are supported to define the time unit:
+
* `d, day, days`
* `w, week, weeks` (`1 week` is treated as `7 days`)
* `mon, month, months` (`1 month` is treated as `30 days`)
* `y, year, years` (`1 year` is treated as `365 days`)

[[changeCleanup.abandonIfMergeable]]changeCleanup.abandonIfMergeable::
+
Whether changes which are mergeable should be auto-abandoned. When set
to `false`, `-is:mergeable` is appended to the query used to find
the changes to auto-abandon.
+
By default `true`, meaning mergeable changes are auto-abandoned.
+
If
link:#change.mergeabilityComputationBehavior[`change.mergeabilityComputationBehavior`]
is set to `NEVER`, setting this option to `false` has no effect and it behaves
as though it were set to `true`.

[[changeCleanup.cleanupAccountPatchReview]]changeCleanup.cleanupAccountPatchReview::
+
Whether accountPatchReview data should be also removed when change
gets auto-abandoned.
+
By default `false`.

[[changeCleanup.abandonMessage]]changeCleanup.abandonMessage::
+
Change message that should be posted when a change is abandoned.
+
'${URL}' can be used as a placeholder for the Gerrit web URL.
+
By default "Auto-Abandoned due to inactivity, see
${URL}Documentation/user-change-cleanup.html#auto-abandon\n\n
If this change is still wanted it should be restored.".

[[changeCleanup.startTime]]changeCleanup.startTime::
+
The link:#schedule-configuration-startTime[start time] for running
change cleanups.

[[changeCleanup.interval]]changeCleanup.interval::
+
The link:#schedule-configuration-interval[interval] for running
change cleanups.

link:#schedule-configuration-examples[Schedule examples] can be found
in the link:#schedule-configuration[Schedule Configuration] section.

[[commentlink]]
=== Section commentlink

Comment links are find/replace strings applied to change descriptions,
patch comments, in-line code comments and approval category value descriptions
to turn set strings into hyperlinks.  One common use is for linking to
bug-tracking systems.

In the following example configuration the 'changeid' comment link
will match typical Gerrit Change-Id values and create a hyperlink
to changes which reference it.  The second configuration 'bugzilla'
will hyperlink terms such as 'bug 42' to an external bug tracker,
supplying the argument record number '42' for display.

commentlinks supports link:#reloadConfig[configuration reloads]. Though a
link:cmd-flush-caches.html[flush-caches] of "projects" is needed for the
commentlinks to be immediately available in the UI.

----
[commentlink "changeid"]
  match = (I[0-9a-f]{8,40})
  link = "#/q/$1"

[commentlink "bugzilla"]
  match = "(^|\\s)(bug\\s+#?)(\\d+)($|\\s)"
  link = http://bugs.example.com/show_bug.cgi?id=$3
  prefix = $1
  suffix = $4
  text = $2$3
----

Comment links can also be specified in `project.config` and sections in
children override those in parents.

[[commentlink.name.match]]commentlink.<name>.match::
+
A JavaScript regular expression to match positions to be replaced
with a hyperlink.  Subexpressions of the matched string can be
stored using groups and accessed with `$'n'` syntax, where 'n'
is the group number, starting from 1.
+
The configuration file parser eats one level of backslashes, so the
character class `\s` requires `\\s` in the configuration file.  The
parser also terminates the line at the first `#`, so a match
expression containing # must be wrapped in double quotes.
+
To match case insensitive strings, a character class with both the
upper and lower case character for each position must be used.  For
example, to match the string `bug` in a case insensitive way the match
pattern `[bB][uU][gG]` needs to be used.
+
The commentlink.name.match regular expressions are applied to the raw,
unformatted and unescaped text form. Regex matching against HTML is not
supported. Comment link patterns that are written in this style should
be updated to match text formats.
+
A common pattern to match is `bug\\s+(\\d+)`.
+
In order to better control the visual presentation of the link `prefix`,
`suffix` and `text` is used. With the generated link html looking like:
`prefix<a ...>text</a>suffix`.

[[commentlink.name.link]]commentlink.<name>.link::
+
The URL to direct the user to whenever the regular expression is
matched.  Groups in the match expression may be accessed as `$'n'`.

[[commentlink.name.prefix]]commentlink.<name>.prefix::
+
The text inserted before the link. Groups in the match expression may be
accessed as `$'n'`.

[[commentlink.name.suffix]]commentlink.<name>.suffix::
+
The text inserted after the link. Groups in the match expression may be
accessed as `$'n'`.

[[commentlink.name.text]]commentlink.<name>.text::
+
The text content of the link. Groups in the match expression may be
accessed as `$'n'`.
+
If not specified defaults to `$&` (the matched text).

[[commentlink.name.enabled]]commentlink.<name>.enabled::
+
Whether the comment link is enabled. A child project may override a
section in a parent or the site-wide config that is disabled by
specifying `enabled = true`.
+
By default, true.
+
Note that the names and contents of disabled sections are visible even
to anonymous users via the
link:rest-api-projects.html#get-config[REST API].


[[container]]
=== Section container

These settings are applied only if Gerrit is started as the container
process through Gerrit's 'gerrit.sh' rc.d compatible wrapper script.

[[container.heapLimit]]container.heapLimit::
+
Maximum heap size of the Java process running Gerrit, in bytes.
This property is translated into the '-Xmx' flag for the JVM.
+
Default is platform and JVM specific.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[container.javaHome]]container.javaHome::
+
Path of the JRE/JDK installation to run Gerrit with.  If not set, the
Gerrit startup script will attempt to search your system and guess
a suitable JRE.  Overrides the environment variable 'JAVA_HOME'.

[[container.javaOptions]]container.javaOptions::
+
Additional options to pass along to the Java runtime. May be specified
multiple times to configure multiple values. If multiple values are
configured, they are passed in order on the command line, separated by
spaces.  These options are appended onto 'JAVA_OPTIONS'.
+
For example, it is possible to overwrite Gerrit's default log4j
configuration:
+
----
  javaOptions = -Dlog4j.configuration=file:///home/gerrit/site/etc/log4j.properties
----
+
Gerrit built-in loggers are then ignored: error logger (`error_log` file),
link:#httpd.requestLog[httpd.requestLog] and
link:#sshd.requestLog[sshd.requestLog]. The
link:#log.jsonLogging[log.jsonLogging] and
link:#log.textLogging[log.textLogging] options are also ignored.

[[container.daemonOpt]]container.daemonOpt::
+
Additional options to pass to the daemon (e.g. '--enable-httpd'). If
multiple values are configured, they are passed in that order to the command
line, separated by spaces.
+
Execute `java -jar gerrit.war daemon --help` to see all possible
options.

[[container.replica]]container.replica::
+
Used on Gerrit replica installations. If set to true the Gerrit JVM is
called with the '--replica' switch, enabling replica mode. If no value is
set (or any other value), Gerrit defaults to primary mode enabling write
operations.

[[container.slave]]container.slave::
+
Backward compatibility for link:#container.replica[`container.replica`]
config setting.

[[container.startupTimeout]]container.startupTimeout::
+
The maximum time (in seconds) to wait for a gerrit.sh start command
to run a new Gerrit daemon successfully.  If not set, defaults to
90 seconds.

[[container.user]]container.user::
+
Login name (or UID) of the operating system user the Gerrit JVM
will execute as.  If not set, defaults to the user who launched
the 'gerrit.sh' wrapper script.

[[container.war]]container.war::
+
Path of the JAR file to start daemon execution with.  This should
be the path of the local 'gerrit.war' archive.  Overrides the
environment variable 'GERRIT_WAR'.
+
If not set, defaults to '$site_path/bin/gerrit.war', or to
'$HOME/gerrit.war'.


[[core]]
=== Section core

[NOTE]
The link:#jgitConfig[etc/jgit.config] file supports configuration of all JGit
options.

[[core.packedGitWindowSize]]core.packedGitWindowSize::
+
Number of bytes of a pack file to load into memory in a single
read operation.  This is the "page size" of the JGit buffer cache,
used for all pack access operations.  All disk IO occurs as single
window reads.  Setting this too large may cause the process to load
more data than is required; setting this too small may increase
the frequency of `read()` system calls.
+
Default on JGit is 8 KiB on all platforms.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[core.packedGitLimit]]core.packedGitLimit::
+
Maximum number of bytes to load and cache in memory from pack files.
If JGit needs to access more than this many bytes it will unload less
frequently used windows to reclaim memory space within the process.
As this buffer must be shared with the rest of the JVM heap, it
should be a fraction of the total memory available.
+
Default on JGit is 10 MiB on all platforms.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[core.packedGitUseStrongRefs]]core.packedGitUseStrongRefs::
+
Set to `true` in order to use strong references to reference packfile
pages cached in the WindowCache. Otherwise SoftReferences are used.
If this option is set to `false`, the Java garbage collector will
flush the WindowCache to free memory if the used heap comes close to
the maximum heap size. This has the advantage that it can quickly
reclaim memory which was used by the WindowCache but comes at the
price that the previously cached pack file content needs to be again
copied from the file system cache to the Gerrit process.
Setting this option to `true` prevents flushing the WindowCache
which provides more predictable performance.
+
Default is `false`.

[[core.deltaBaseCaseLimit]]core.deltaBaseCacheLimit::
+
Maximum number of bytes to reserve for caching base objects
that multiple deltafied objects reference.  By storing the entire
decompressed base object in a cache Git is able to avoid unpacking
and decompressing frequently used base objects multiple times.
+
Default on JGit is 10 MiB on all platforms.  You probably do not
need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[core.packedGitOpenFiles]]core.packedGitOpenFiles::
+
Maximum number of pack files to have open at once.  A pack file
must be opened in order for any of its data to be available in
a cached window.
+
If you increase this to a larger setting you may need to also adjust
the ulimit on file descriptors for the host JVM, as Gerrit needs
additional file descriptors available for network sockets and other
repository data manipulation.
+
Default on JGit is 128 file descriptors on all platforms.

[[core.streamFileThreshold]]core.streamFileThreshold::
+
Largest object size, in bytes, that JGit will allocate as a
contiguous byte array.  Any file revision larger than this threshold
will have to be streamed, typically requiring the use of temporary
files under '$GIT_DIR/objects' to implement pseudo-random access
during delta decompression.
+
Servers with very high traffic should set this to be larger than
the size of their common big files.  For example a server managing
the Android platform typically has to deal with ~10-12 MiB XML
files, so `15 m` would be a reasonable setting in that environment.
Setting this too high may cause the JVM to run out of heap space
when handling very big binary files, such as device firmware or
CD-ROM ISO images.
+
Defaults to 25% of the available JVM heap, limited to 2g.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[core.packedGitMmap]]core.packedGitMmap::
+
When true, JGit will use `mmap()` rather than `malloc()+read()`
to load data from pack files.  The use of mmap can be problematic
on some JVMs as the garbage collector must deduce that a memory
mapped segment is no longer in use before a call to `munmap()`
can be made by the JVM native code.
+
In server applications (such as Gerrit) that need to access many
pack files, setting this to true risks artificially running out
of virtual address space, as the garbage collector cannot reclaim
unused mapped spaces fast enough.
+
Default on JGit is false. Although potentially slower, it yields
much more predictable behavior.

[[core.asyncLoggingBufferSize]]core.asyncLoggingBufferSize::
+
Size of the buffer to store logging events for asynchronous logging.
Putting a larger value can protect threads from stalling when the
AsyncAppender threads are not fast enough to consume the logging events
from the buffer. It also protects from losing log entries in this case.
+
Default is 64 entries.

[[core.useRecursiveMerge]]core.useRecursiveMerge::
+
Use JGit's recursive merger for three-way merges. This only affects
projects that allow content merges.
+
As explained in this
link:http://codicesoftware.blogspot.com/2011/09/merge-recursive-strategy.html[
blog,role=external,window=_blank], the recursive merge produces better results if the two commits
that are merged have more than one common predecessor.
+
Default is true.

[[core.repositoryCacheCleanupDelay]]core.repositoryCacheCleanupDelay::
+
Delay between each periodic cleanup of expired repositories.
+
Values can be specified using standard time unit abbreviations (`ms`, `sec`,
`min`, etc.).
+
Set it to 0 in order to switch off cache expiration. If cache expiration is
switched off, the JVM can still evict cache entries when it is running low
on available heap memory.
+
Set it to -1 to automatically derive cleanup delay from
`core.repositoryCacheExpireAfter` (lowest value between 1/10 of
`core.repositoryCacheExpireAfter` and 10 minutes).
+
Default is -1.

[[core.repositoryCacheExpireAfter]]core.repositoryCacheExpireAfter::
+
Time an unused repository should expire and be evicted from the repository
cache.
+
Values can be specified using standard time unit abbreviations (`ms`, `sec`,
`min`, etc.).
+
Default is 1 hour.

[[dashboard]]
=== Section dashboard

[[dashboard.submitRequirementColumns]]dashboard.submitRequirementColumns::
+
The list of submit requirement names that should be displayed as separate
columns in the dashboard.

[[download]]
=== Section download

----
[download]
  command = checkout
  command = cherry_pick
  command = pull
  command = format_patch
  scheme = ssh
  scheme = http
  scheme = anon_http
  scheme = anon_git
  scheme = repo
----

The download section configures the allowed download methods.

[[download.command]]download.command::
+
Commands that should be offered to download changes.
+
Multiple commands are supported:
+
* `checkout`
+
Command to fetch and checkout the patch set.
+
* `cherry_pick`
+
Command to fetch the patch set and to cherry-pick it onto the current
commit.
+
* `pull`
+
Command to pull the patch set.
+
* `format_patch`
+
Command to fetch the patch set and to feed it into the `format-patch`
command.

+
If `download.command` is not specified, all download commands are
offered.

[[download.scheme]]download.scheme::
+
Schemes that should be used to download changes.
+
Multiple schemes are supported:
+
* `http`
+
Authenticated HTTP download is allowed.
+
* `ssh`
+
Authenticated SSH download is allowed.
+
* `anon_http`
+
Anonymous HTTP download is allowed.
+
* `anon_git`
+
Anonymous Git download is allowed.  This is not default, it is also
necessary to set <<gerrit.canonicalGitUrl,gerrit.canonicalGitUrl>>
variable.
+
* `repo`
+
Gerrit advertises patch set downloads with the `repo download`
command, assuming that all projects managed by this instance are
generally worked on with the
https://gerrit.googlesource.com/git-repo[repo multi-repository tool].
This is not default, as not all instances will deploy repo.

+
If `download.scheme` is not specified, SSH, HTTP and Anonymous HTTP
downloads are allowed.

[[download.checkForHiddenChangeRefs]]download.checkForHiddenChangeRefs::
+
Whether the download commands should be adapted when the change refs
are hidden.
+
Git has a configuration option to hide refs from the initial
advertisement (`uploadpack.hideRefs`). This option can be used to hide
the change refs from the client. As consequence fetching changes by
change ref does not work anymore. However by setting
`uploadpack.allowTipSha1InWant` to `true` fetching changes by commit ID
is possible. If `download.checkForHiddenChangeRefs` is set to `true`
the git download commands use the commit ID instead of the change ref
when a project is configured like this.
+
Example git configuration on a project:
+
----
[uploadpack]
  hideRefs = refs/changes/
  hideRefs = refs/cache-automerge/
  allowTipSha1InWant = true
----
+
By default `false`.

[[download.archive]]download.archive::
+
Specifies which archive formats, if any, should be offered on the change
screen and supported for `git-upload-archive` operation:
+
----
[download]
  archive = tar
  archive = tbz2
  archive = tgz
  archive = txz
  archive = zip
----

If `download.archive` is not specified defaults to all archive
commands. Set to `off` or empty string to disable.

Zip is not supported because it may be interpreted by a Java plugin as a
valid JAR file, whose code would have access to cookies on the domain.
For this reason `zip` format is always excluded from formats offered
through the `Download` drop down or accessible in the REST API.

[[download.maxBundleSize]]download.maxBundleSize::
+
Specifies the maximum size of a bundle in bytes that can be downloaded.
As bundles are kept in memory this setting is to protect the server
from a single request consuming too much heap when generating
a bundle and thereby impacting other users.
+
Defaults to 100MB.

[[gc]]
=== Section gc

This section allows to configure the git garbage collection and schedules it
to run periodically. It will be triggered and executed sequentially for all
projects.

[[gc.aggressive]]gc.aggressive::
+
Determines if scheduled garbage collections and garbage collections triggered
through Web-UI should run in aggressive mode or not. Aggressive garbage
collections are more expensive but may lead to significantly smaller
repositories.
+
Valid values are "true" and "false," default is "false".

[[gc.startTime]]gc.startTime::
+
The link:#schedule-configuration-startTime[start time] for running the
git garbage collection.

[[gc.interval]]gc.interval::
+
The link:#schedule-configuration-interval[interval] for running the
git garbage collection.

link:#schedule-configuration-examples[Schedule examples] can be found
in the link:#schedule-configuration[Schedule Configuration] section.

[[gerrit]]
=== Section gerrit

[[gerrit.basePath]]gerrit.basePath::
+
Local filesystem directory holding all Git repositories that
Gerrit knows about and can process changes for.  A project
entity in Gerrit maps to a local Git repository by creating
the path string `"${basePath}/${project_name}.git"`.
+
If relative, the path is resolved relative to `'$site_path'`.

[[gerrit.allProjects]]gerrit.allProjects::
+
Name of the permissions-only project defining global server
access controls and settings. These are inherited into every
other project managed by the running server. The name is
relative to `gerrit.basePath`.
+
The link:#cache_names[persisted_projects cache] must be
flushed after this setting is changed.
+
Defaults to `All-Projects` if not set.

[[gerrit.defaultBranch]]gerrit.defaultBranch::
+
Name of the link:project-configuration.html#default-branch[default branch]
to use on the project creation, if no other branches were specified in the input.
+
Defaults to `refs/heads/master` if not set.

[[gerrit.allUsers]]gerrit.allUsers::
+
Name of the project in which meta data of all users is stored.
The name is relative to `gerrit.basePath`.
+
Defaults to `All-Users` if not set.

[[gerrit.canonicalWebUrl]]gerrit.canonicalWebUrl::
+
The default URL for Gerrit to be accessed through.
+
Typically this would be set to something like "http://review.example.com/"
or "http://example.com:8080/gerrit/" so Gerrit can output links that point
back to itself.
+
Setting this is highly recommended, as it is necessary for the upload
code invoked by "git push" or "repo upload" to output hyperlinks
to the newly uploaded changes.

[[gerrit.canonicalGitUrl]]gerrit.canonicalGitUrl::
+
Optional base URL for repositories available over the anonymous git
protocol.  For example, set this to `git://mirror.example.com/base/`
to have Gerrit display patch set download URLs in the UI.  Gerrit
automatically appends the project name onto the end of the URL.
+
By default unset, as the git daemon must be configured externally
by the system administrator, and might not even be running on the
same host as Gerrit.

[[gerrit.docUrl]]gerrit.docUrl::
+
Optional base URL for documentation, under which one can find
"index.html", "rest-api.html", etc. Used as the base for the fixed set
of links in the "Documentation" tab. A slash is implicitly appended.
(For finer control over the top menu, consider writing a
link:dev-plugins.html#top-menu-extensions[plugin].)
+
If unset or empty, the documentation tab will only be shown if
`/Documentation/index.html` can be reached by the browser at app load
time.

[[gerrit.editGpgKeys]]gerrit.editGpgKeys::
+
If enabled and server-side signed push validation is also
link:#receive.enableSignedPush[enabled], enable the
link:rest-api-accounts.html#list-gpg-keys[REST API endpoints] and web UI
for editing GPG keys. If disabled, GPG keys can only be added by
administrators with direct git access to All-Users.
+
Defaults to true.

[[gerrit.installCommitMsgHookCommand]]gerrit.installCommitMsgHookCommand::
+
Optional command to install the `commit-msg` hook. Typically of the
form:
+
----
fetch-cmd some://url/to/commit-msg .git/hooks/commit-msg ; chmod +x .git/hooks/commit-msg
----
+
By default unset; falls back to using scp from the canonical SSH host,
or curl from the canonical HTTP URL for the server.  Only necessary if a
proxy or other server/network configuration prevents clients from
fetching from the default location.

[[gerrit.gitHttpUrl]]gerrit.gitHttpUrl::
+
Optional base URL for repositories available over the HTTP
protocol.  For example, set this to `http://mirror.example.com/base/`
to have Gerrit display URLs from this server, rather than itself.
+
By default unset, as the HTTP daemon must be configured externally
by the system administrator, and might not even be running on the
same host as Gerrit.

[[gerrit.installBatchModule]]gerrit.installBatchModule::
+
Repeatable list of class name of additional Guice modules to load as
override to the batchInjector's modules during the init phases.
Classes are resolved using the primary Gerrit class loader, hence the
class needs to be either declared in Gerrit or an additional JAR
located under the `/lib` directory.
+
By default unset.

[[gerrit.installDbModule]]gerrit.installDbModule::
+
Repeatable list of class name of additional Guice modules to load at
Gerrit startup as part of the dbInjector.
Classes are resolved using the primary Gerrit class loader, hence the
class needs to be either declared in Gerrit or an additional JAR
located under the `/lib` directory.
+
By default unset.

[[gerrit.installIndexModule]]gerrit.installIndexModule::
+
Class name of the Guice modules to load as alternate implementation
for the Gerrit indexes backend.
Classes are resolved using the primary Gerrit class loader, hence the
class needs to be either declared in Gerrit or an additional JAR
located under the `/lib` directory.
+
NOTE: The `gerrit.installIndexModule` has precedence over the
`index.type`.
+
By default unset.
+
Example:
----
[gerrit]
  installIndexModule = com.google.gerrit.elasticsearch.ElasticIndexModule
----
+
[[gerrit.installModule]]gerrit.installModule::
+
Repeatable list of class name of additional Guice modules to load at
Gerrit startup as part of the sysInjector.
Classes are resolved using the primary Gerrit class loader, hence the
class needs to be either declared in Gerrit or an additional JAR
located under the `/lib` directory.
+
By default unset.
+
Example:
----
[gerrit]
  installModule = com.googlesource.gerrit.libmodule.MyModule
  installModule = com.example.abc.OurSpecialSauceModule
  installDbModule = com.example.def.OurCustomProvider
  installBatchModule = com.example.ghi.CustomBatchInitModule
----

[[gerrit.listProjectsFromIndex]]gerrit.listProjectsFromIndex::
+
Enable rendering of project list from the secondary index instead
of purely relying on the in-memory cache.
+
By default false.
+
[NOTE]
The in-memory cache (set to false) rendering provides an **unlimited list** as a result
of the list project API, causing the full list of projects to be
returned as a result of the link:rest-api-projects.html[/projects/] REST API
or the link:cmd-ls-projects.html[gerrit ls-projects] SSH command.
When the rendering from the secondary index (set to true),
the **list is limited** by the global capability
link:access-control.html#capability_queryLimit[queryLimit]
which is defaulted to 500 entries.

[[gerrit.primaryWeblinkName]]gerrit.primaryWeblinkName::
+
Name of the link:dev-plugins.html#links-to-external-tools[Weblink] that should
be chosen in cases where only one Weblink can be used in the UI, for example in
inline links.
+
By default unset, meaning that the UI is responsible for trying to identify
a weblink to be used in these cases, most likely weblinks that links to code
browsers with known integrations with Gerrit (like Gitiles and Gitweb).
+
Example:
----
[gerrit]
  primaryWeblinkName = gitiles
----

[[gerrit.reportBugUrl]]gerrit.reportBugUrl::
+
URL to direct users to when they need to report a bug.
+
By default unset, meaning no bug report URL will be displayed. Administrators
should set this to the URL of their issue tracker, if necessary.

[[gerrit.enablePeerIPInReflogRecord]]gerrit.enablePeerIPInReflogRecord::

Record actual peer IP address in ref log entry for identified user.

Defaults to false.

[[gerrit.secureStoreClass]]gerrit.secureStoreClass::
+
Use the secure store implementation from a specified class.
+
If specified, must be the fully qualified class name of a class that implements
the `com.google.gerrit.server.securestore.SecureStore` interface, and the jar
file containing the class must be placed in the `$site_path/lib` folder.
+
If not specified, the default no-op implementation is used.

[[gerrit.canLoadInIFrame]]gerrit.canLoadInIFrame::
+
For security reasons Gerrit will always jump out of iframe.
Setting this option to true will prevent this behavior.
+
By default false.

[[gerrit.xframeOption]]gerrit.xframeOption::
+
Add link:https://tools.ietf.org/html/rfc7034[`X-Frame-Options`] header to all HTTP
responses. The `X-Frame-Options` HTTP response header can be used to indicate
whether or not a browser should be allowed to render a page in a
`<frame>`, `<iframe>`, `<embed>` or `<object>`.
+
Available values:
+
1. ALLOW - The page can be displayed in a frame.
2. SAMEORIGIN - The page can only be displayed in a frame on the same origin as the page itself.
+
If link:#gerrit.canLoadInIFrame is set to false this option is ignored and the
`X-Frame-Options` header is always set to `DENY`.
Setting this option to `ALLOW` will cause the `X-Frame-Options` header to be omitted
the the page can be displayed in a frame.
+
By default SAMEORIGIN.

[[gerrit.cdnPath]]gerrit.cdnPath::
+
Path prefix for Gerrit's static resources if using a CDN.

[[gerrit.faviconPath]]gerrit.faviconPath::
+
Path for Gerrit's favicon after link:#gerrit.canonicalWebUrl[default URL],
including icon name and extension (.ico should be used).

[[gerrit.instanceId]]gerrit.instanceId::
+
Optional identifier for this Gerrit instance.
Used to identify a specific instance within a group of Gerrit instances with the
same `serverId` (i.e.: a Gerrit cluster).
Unlike `instanceName` this value is not available in the email templates.

[[gerrit.instanceName]]gerrit.instanceName::
+
Short identifier for this Gerrit instance.
A good name should be short but precise enough so that users can identify the instance among others.
+
Defaults to the full hostname of the Gerrit server.

[[gerrit.experimentalRollingUpgrade]]gerrit.experimentalRollingUpgrade::
+
Enable Gerrit rolling upgrade to the next version.
For example if Gerrit v3.2 is version N (All-Projects:refs/meta/version=183)
then its next version N+1 is v3.3 (All-Projects:refs/meta/version=184).
Allow Gerrit to start even if the underlying schema version has been bumped to
the next Gerrit version.
+
Set to true if Gerrit is installed in
[high-availability configuration](https://gerrit.googlesource.com/plugins/high-availability/+/refs/heads/master/README.md)
during the rolling upgrade to the next version.
+
By default false.
+
The rolling upgrade process, at high level, assumes that Gerrit is installed
on two or more nodes sharing the repositories over NFS. The upgrade is composed
of the following steps:
+
1. Set gerrit.experimentalRollingUpgrade to true on all Gerrit masters
2. Set the first master unhealthy
3. Shutdown the first master and [upgrade](install.html#init) to the next version
4. Startup the first master, wait for the online reindex to complete (where applicable)
5. Verify the the first master upgrade is successful and online reindex is complete
6. Set the first master healthy
7. Repeat steps 2. to 6. for all the other Gerrit nodes
+
[WARNING]
Rolling upgrade may or may not be possible depending on the changes introduced
by the target version of the upgrade. Refer to the release notes and check whether
the rolling upgrade is possible or not and the associated constraints.

[[gerrit.importedServerId]]gerrit.importedServerId::
+
ServerId of the repositories imported from other Gerrit servers. Changes coming
associated with the imported serverIds are indexed and displayed in the UI.
+
Specify multiple `gerrit.importedServerId` for allowing the import from multiple
Gerrit servers with different serverIds.
+
[NOTE]
The account-ids referenced in the imported changes are used for looking up the
associated account-id locally, using the `imported:` external-id.
Example: the account-id 1000 from the imported server-id 59a4964e-6376-4ed9-beef
will be looked up in the local accounts using the `imported:1000@59a4964e-6376-4ed9-beef`
external-id.
+
If this value is not set, all changes imported from other Gerrit servers will be
ignored.
+
By default empty.

[[gerrit.serverId]]gerrit.serverId::
+
Used by NoteDb to, amongst other things, identify author identities from
per-server specific account IDs.
+
If this value is not set on startup it is automatically set to a random UUID.
+
[NOTE]
If this value doesn't match the serverId used when creating an already existing
NoteDb, Gerrit will not be able to use that instance of NoteDb. The serverId
used to create the NoteDb will show in the resulting exception message in case
the value differs.

[[gitweb]]
=== Section gitweb

Gerrit can forward requests to either an internally managed gitweb
(which allows Gerrit to enforce some access controls), or to an
externally managed gitweb (where the web server manages access).
See also link:config-gitweb.html[Gitweb Integration].

[[gitweb.cgi]]gitweb.cgi::
+
Path to the locally installed `gitweb.cgi` executable.  This CGI will
be called by Gerrit Code Review when the URL `/gitweb` is accessed.
Project level access controls are enforced prior to calling the CGI.
+
Defaults to `/usr/lib/cgi-bin/gitweb.cgi` if `gitweb.url` is not set.

[[gitweb.url]]gitweb.url::
+
Optional URL of an affiliated gitweb service.  Defines the
web location where a `gitweb.cgi` is installed to browse
`gerrit.basePath` and the repositories it contains.
+
Gerrit appends any necessary query arguments onto the end of this URL.
For example, `?p=$project.git;h=$commit`.

[[gitweb.type]]gitweb.type::
+
Optional type of affiliated gitweb service. This allows using
alternatives to gitweb, such as cgit.
+
Valid values are `gitweb`, `cgit`, `disabled` or `custom`.
+
If not set, or set to `disabled`, there is no gitweb hyperlinking
support.

[[gitweb.revision]]gitweb.revision::
+
Optional pattern to use for constructing the gitweb URL when pointing
at a specific commit when `gitweb.type` is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit
and `${commit}` for the SHA-1 hash for the commit.

[[gitweb.project]]gitweb.project::
+
Optional pattern to use for constructing the gitweb URL when pointing
at a specific project when `gitweb.type` is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit.

[[gitweb.branch]]gitweb.branch::
+
Optional pattern to use for constructing the gitweb URL when pointing
at a specific branch when `gitweb.type` is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit
and `${branch}` for the name of the branch.

[[gitweb.tag]]gitweb.tag::
+
Optional pattern to use for constructing the gitweb URL when pointing
at a specific tag when `gitweb.type` is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit
and `${tag}` for the name of the tag.

[[gitweb.roottree]]gitweb.roottree::
+
Optional pattern to use for constructing the gitweb URL when pointing
at the contents of the root tree in a specific commit when `gitweb.type`
is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit
and `${commit}` for the SHA-1 hash for the commit.

[[gitweb.file]]gitweb.file::
+
Optional pattern to use for constructing the gitweb URL when pointing
at the contents of a file in a specific commit when `gitweb.type` is
set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit,
`${file}` for the file name, `${hash}` for the SHA-1 hash for the commit,
and `${commit}` for the change ref or SHA-1 of the commit if no base
patch set.

[[gitweb.filehistory]]gitweb.filehistory::
+
Optional pattern to use for constructing the gitweb URL when pointing
at the history of a file in a specific branch when when `gitweb.type`
is set to `custom`.
+
Valid replacements are `${project}` for the project name in Gerrit,
`${file}` for the file name and `${branch}` for the name of the
branch.

[[gitweb.linkname]]gitweb.linkname::
+
Optional setting for modifying the link name presented to the user
in the Gerrit web-UI.
+
The default linkname for custom type is `gitweb`.

[[gitweb.pathSeparator]]gitweb.pathSeparator::
+
Optional character to substitute the standard path separator (slash) in
project names and branch names.
+
By default, Gerrit will use hexadecimal encoding for slashes in project and
branch names. Some web servers, such as Tomcat, reject this hexadecimal
encoding in the URL.
+
Some alternative gitweb services, such as link:http://gitblit.com[Gitblit,role=external,window=_blank],
allow using an alternative path separator character. In Gitblit, this can be
configured through the property link:http://gitblit.com/properties.html[web.forwardSlashCharacter,role=external,window=_blank].
In Gerrit, the alternative path separator can be configured correspondingly
using the property `gitweb.pathSeparator`.
+
Valid values are the characters `*`, `(` and `)`.

[[gitweb.urlEncode]]gitweb.urlEncode::
+
Whether or not Gerrit should encode the generated viewer URL.
+
Gerrit composes the viewer URL using information about the project, branch, file
or commit of the target object to be displayed. Typically viewers such as CGit
and gitweb do need those parts to be encoded, including the `/` in project's name,
for being correctly parsed.
However other viewers could instead require an unencoded URL (e.g. GitHub web
based viewer).
+
Valid values are `true` and `false`. The default is `true`.

[[groups]]
=== Section groups

[[groups.includeExternalUsersInRegisteredUsersGroup]]groups.includeExternalUsersInRegisteredUsersGroup::
+
Controls whether external users (these are users we have sufficient
knowledge about but who don't yet have a Gerrit account) are considered
to be members of the `REGISTERED_USERS` group.
+
This setting only makes sense if you run custom code (e.g. from a plugin
or a custom authentication backend). By default, Gerrit core always requires
users to register and doesn't use external users.
+
By default, true.

[[groups.newGroupsVisibleToAll]]groups.newGroupsVisibleToAll::
+
Controls whether newly created groups should be by default visible to
all registered users.
+
By default, false.

[[groups.uuid.name]]groups.<uuid>.name::
+
Display name for group with the given UUID.
+
This option is only supported for system groups (scheme 'global').
+
E.g. this parameter can be used to configure another name for the
`Anonymous Users` group:
+
----
[groups "global:Anonymous-Users"]
  name = All Users
----
+
When setting this parameter it should be verified that there is no
existing group with the same name (case-insensitive). Configuring an
ambiguous name makes Gerrit fail on startup. Once set Gerrit ensures
that it is not possible to create a group with this name. Gerrit also
keeps the default name reserved so that it cannot be used for new
groups either. This means there is no danger of ambiguous group names
when this parameter is removed and the system group uses the default
name again.

[[groups.relevantGroup]]groups.relevantGroup::
+
UUID of an external group that should always be considered as relevant
when checking whether an account is visible.
+
This setting is only relevant for external group backends and only if
the link:#accounts.visibility[account visibility] is set to
`SAME_GROUP` or `VISIBLE_GROUP`.
+
If the link:#accounts.visibility[account visibility] is set to
`SAME_GROUP` or `VISIBLE_GROUP` users should see all accounts that are
a member of a group that contains themselves or that is visible to
them. Checking this would require getting all groups of the current
user and all groups of the accounts for which the visibility is being
checked, but since getting all groups that a user is a member of is
expensive for external group backends Gerrit doesn't query these groups
but instead guesses the relevant groups. Guessing relevant groups
limits the inspected groups to all groups that are mentioned in the
ACLs of the projects that are currently cached (i.e. all groups that
are listed in the link:config-project-config.html#file-groups[groups]
files of the cached projects). This is not very reliable since it
depends on which groups are mentioned in the ACLs and which projects
are currently cached. To make this more reliable this configuration
parameter allows to configure external groups that should always be
considered as relevant.
+
As said this setting is only relevant for external group backends. In
Gerrit core this is only the LDAP backend, but it may apply to further
group backends that are added by plugins.
+
This parameter may be added multiple times to specify multiple relevant
groups.

[[has-operand-alias]]
=== Section has operand alias

'has' operand aliasing allows global aliases to be defined for query
'has' operands. Currently only change queries are supported. The alias
name is the git config key name, and the 'has' operand being aliased
is the git config value.

For example:

----
[has-operand-alias "change"]
  oldtopic = topic
----

This section is particularly useful to alias 'has' operands (which may
be long and clunky as they include a plugin name in them) to shorter
operands without the plugin name. Admins should take care to choose
shorter operands that are unique and unlikely to conflict in the future.

Aliases are resolved dynamically at invocation time to the currently
loaded version of plugins. If a referenced plugin is not loaded, or
does not define the command, "unsupported operand" is returned to the
user.

Aliases will override existing 'has' operands. In case of multiple
aliases with same name, the last one defined will be used.

When the target of an alias does not exist, the 'has' operand with the
name of the alias will be used (if present). This enables an admin to
configure the system to override a core 'has' operand with an operand
provided by a plugin when present and otherwise fall back to the 'has'
operand provided by core.

[[http]]
=== Section http

[[http.proxy]]http.proxy::
+
URL of the proxy server when making outgoing HTTP
connections for OpenID login transactions.  Syntax
should be `http://`'hostname'`:`'port'.

[[http.proxyUsername]]http.proxyUsername::
+
Optional username to authenticate to the HTTP proxy with.
This property is honored only if the username does not
appear in the http.proxy property above.

[[http.proxyPassword]]http.proxyPassword::
+
Optional password to authenticate to the HTTP proxy with.
This property is honored only if the password does not
appear in the http.proxy property above.

[[http.addUserAsRequestAttribute]]http.addUserAsRequestAttribute::
+
If true, 'User' attribute will be added to the request attributes so it
can be accessed outside the request scope (will be set to username or id
if username not configured).
+
This attribute can be used by the servlet container to log user in the
http access log.
+
When running the embedded servlet container, this attribute is used to
print user in the httpd_log.
+
* `%{User}r`
+
Pattern to print user in Tomcat AccessLog.

+
Default value is true.

[[http.addUserAsResponseHeader]]http.addUserAsResponseHeader::
+
If true, the header 'User' will be added to the list of response headers so it
can be accessed from a reverse proxy for logging purposes.

+
Default value is false.

[[httpd]]
=== Section httpd

The httpd section configures the embedded servlet container.

[[httpd.listenUrl]]httpd.listenUrl::
+
Configuration for the listening sockets of the internal HTTP daemon.
Each entry of `listenUrl` combines the following options for a
listening socket: protocol, network address, port and context path.
+
_Protocol_ can be either `http://`, `https://`, `proxy-http://` or
`proxy-https://`. The latter two are special forms of `http://` with
awareness of a reverse proxy (see below). _Network address_ selects
the interface and/or scope of the listening socket. For notes
examples, see below. _Port_ is the TCP port number and is optional
(default value depends on the protocol). _Context path_ is the
optional "base URI" for the Gerrit Code Review as application to
serve on.
+
**Protocol** schemes:
+
* `http://`
+
Plain-text HTTP protocol.  If port is not supplied, defaults to 80,
the standard HTTP port.
+
* `https://`
+
SSL encrypted HTTP protocol.  If port is not supplied, defaults to
443, the standard HTTPS port.
+
For configuration of the certificate and private key, see
<<httpd.sslKeyStore,httpd.sslKeyStore>>.
+
[NOTE]
SSL/TLS configuration capabilities of Gerrit internal HTTP daemon
are very limited. Externally facing production sites are strongly
encouraged to use a reverse proxy configuration to handle SSL/TLS
and use a `proxy-https://` scheme here (below) for security and
performance reasons.
+
* `proxy-http://`
+
Plain-text HTTP relayed from a reverse proxy.  If port is not
supplied, defaults to 8080.
+
Like `http://`, but additional header parsing features are
enabled to honor `X-Forwarded-For`, `X-Forwarded-Host` and
`X-Forwarded-Server`.  These headers are typically set by Apache's
link:https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#x-headers[mod_proxy,role=external,window=_blank].
+
[NOTE]
--
For secruity reasons, make sure to only allow connections from a
trusted reverse proxy in your network, as clients could otherwise
easily spoof these headers and thus spoof their originating IP
address effectively. If the reverse proxy is running on the same
machine as Gerrit daemon, the use of a _loopback_ network address
to bind to (see below) is strongly recommended to mitigate this.

If not using Apache's mod_proxy, validate that your reverse proxy
sets these headers on all requests. If not, either configure it to
sanitize them from the origin, or use the `http://` scheme instead.
--
+
* `proxy-https://`
+
Plain-text HTTP relayed from a reverse proxy that has already
handled the SSL encryption/decryption.  If port is not supplied,
defaults to 8080.
+
Behaves exactly like `proxy-http://`, but also sets the scheme to
assume `https://` is the proper URL back to the server.

+
--
**Network address** forms:

* Loopback (localhost): `127.0.0.1` (IPv4) or `[::1]` (IPv6).
* All (unspecified): `0.0.0.0` (IPv4), `[::]` (IPv6) or `*`
  (IPv4 and IPv6)
* Interface IP address, e.g. `1.2.3.4` (IPv4) or
  `[2001:db8::a00:20ff:fea7:ccea]` (IPv6)
* Hostname, resolved at startup time to an address.

**Context path** is the local part of the URL to be used to access
Gerrit on ('base URL'). E.g. `/gerrit/` to serve Gerrit on that URI
as base. If set, consider to align this with the
<<gerrit.canonicalWebUrl,gerrit.canonicalWebUrl>> setting. Correct
settings may depend on the reverse proxy configuration as well. By
default, this is `/` so that Gerrit serves requests on the root.

If multiple values are supplied, the daemon will listen on all
of them.

Examples:

----
[httpd]
    listenUrl = proxy-https://127.0.0.1:9999/gerrit/
[gerrit]
    # Reverse proxy is configured to serve with SSL/TLS on
    # example.com and to relay requests on /gerrit/ onto
    # http://127.0.0.1:9999/gerrit/
    canonicalWebUrl = https://example.com/gerrit/
----

----
[httpd]
    # Listen on specific external interface with plaintext
    # HTTP on IPv6.
    listenUrl = http://[2001:db8::a00:20ff:fea7:ccea]

    # Also listen on specific internal interface for use with
    # reverse proxy run on another host.
    listenUrl = proxy-https://192.168.100.123
----

See also the page on link:config-reverseproxy.html[reverse proxy]
configuration.

By default, `\http://*:8080`.
--

[[httpd.reuseAddress]]httpd.reuseAddress::
+
If true, permits the daemon to bind to the port even if the port
is already in use.  If false, the daemon ensures the port is not
in use before starting.  Busy sites may need to set this to true
to permit fast restarts.
+
By default, true.

[[httpd.gracefulStopTimeout]]httpd.gracefulStopTimeout::
+
Set a graceful stop time. If set, the daemon ensures that all incoming
calls are preserved for a maximum period of time, before starting
the graceful shutdown process. Sites behind a workload balancer such as
HAProxy would need this to be set for avoiding serving errors during
rolling restarts.
+
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
+
By default, 0 seconds (immediate shutdown).

[[httpd.inheritChannel]]httpd.inheritChannel::
+
If true, permits the daemon to inherit its server socket channel
from fd0/1(stdin/stdout). When set to true, the server can be socket
activated via systemd or xinetd.
+
By default, false.

[[httpd.requestHeaderSize]]httpd.requestHeaderSize::
+
Size, in bytes, of the buffer used to parse the HTTP headers of an
incoming HTTP request.  The entire request headers, including any
cookies sent by the browser, must fit within this buffer, otherwise
the server aborts with the response '413 Request Entity Too Large'.
+
One buffer of this size is allocated per active connection.
Allocating a buffer that is too large wastes memory that cannot be
reclaimed, allocating a buffer that is too small may cause unexpected
errors caused by very long Referer URLs or large cookie values.
+
By default, 16384 (16 K), which is sufficient for most OpenID and
other web-based single-sign-on integrations.

[[httpd.sslCrl]]httpd.sslCrl::
+
Path of the certificate revocation list file in PEM format. This
crl file is optional, and available for CLIENT_SSL_CERT_LDAP
authentication.
+
To create and view a crl using openssl:
+
----
openssl ca -gencrl -out crl.pem
openssl crl -in crl.pem -text
----
+
If not absolute, the path is resolved relative to `$site_path`.
+
By default, `$site_path/etc/crl.pem`.

[[httpd.sslKeyStore]]httpd.sslKeyStore::
+
Path of the Java keystore containing the server's SSL certificate
and private key.  This keystore is required for `https://` in URL.
+
To create a self-signed certificate for simple internal usage:
+
----
keytool -keystore keystore -alias jetty -genkey -keyalg RSA
chmod 600 keystore
----
+
If not absolute, the path is resolved relative to `$site_path`.
+
By default, `$site_path/etc/keystore`.

[[httpd.sslKeyPassword]]httpd.sslKeyPassword::
+
Password used to decrypt the private portion of the sslKeyStore.
Java keystores require a password, even if the administrator
doesn't want to enable one.
+
If set to the empty string the embedded server will prompt for the
password during startup.
+
By default, `gerrit`.

[[httpd.requestLog]]httpd.requestLog::
+
Enable (or disable) the `'$site_path'/logs/httpd_log` request log.
If enabled, an NCSA combined log format request log file is written
out by the internal HTTP daemon. The httpd log format is documented
link:logs.html#_httpd_log[here].
+
`log4j.appender` with the name `httpd_log` can be configured to overwrite
programmatic configuration.
+
By default, true if httpd.listenUrl uses http:// or https://,
and false if httpd.listenUrl uses proxy-http:// or proxy-https://.

[[httpd.acceptorThreads]]httpd.acceptorThreads::
+
Number of worker threads dedicated to accepting new incoming TCP
connections and allocating them connection-specific resources.
+
By default, 2, which should be suitable for most high-traffic sites.

[[httpd.minThreads]]httpd.minThreads::
+
Minimum number of spare threads to keep in the worker thread pool.
This number must be at least 1 larger than httpd.acceptorThreads
multiplied by the number of httpd.listenUrls configured.
+
By default, 5, suitable for most lower-volume traffic sites.

[[httpd.maxThreads]]httpd.maxThreads::
+
Maximum number of threads to permit in the worker thread pool.
+
By default 25, suitable for most lower-volume traffic sites.
+
[NOTE]
Unless SSH daemon is disabled, see <<sshd.listenAddress, sshd.listenAddress>>,
the max number of concurrent Git requests over HTTP and SSH together is
defined by the <<sshd.threads, sshd.threads>> and
<<sshd.batchThreads, sshd.batchThreads>>.

[[httpd.maxQueued]]httpd.maxQueued::
+
Maximum number of client connections which can enter the worker
thread pool waiting for a worker thread to become available.
0 sets the queue size to the Integer.MAX_VALUE.
+
By default 200.

[[httpd.maxWait]]httpd.maxWait::
+
Maximum amount of time a client will wait for an available
thread to handle a project clone, fetch or push request over the
smart HTTP transport.
+
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days
* w, week, weeks (`1 week` is treated as `7 days`)
* mon, month, months (`1 month` is treated as `30 days`)
* y, year, years (`1 year` is treated as `365 days`)

+
--
If a unit suffix is not specified, `minutes` is assumed.  If 0
is supplied, the maximum age is infinite and connections will not
abort until the client disconnects.

By default, 5 minutes.
--

[[httpd.filterClass]]httpd.filterClass::
+
Class that implements the javax.servlet.Filter interface
for filtering any HTTP related traffic going through the Gerrit
HTTP protocol.
Class is loaded and configured in the Gerrit Jetty container
and run in front of all Gerrit URL handlers, allowing the filter
to inspect, modify, allow or reject each request.
It needs to be provided as JAR library
under $GERRIT_SITE/lib as it is resolved using the default Gerrit class
loader and cannot be dynamically loaded by a plugin.
+
Failing to load the Filter class would result in a Gerrit start-up
failure, as this class is supposed to provide mandatory filtering
in front of Gerrit HTTP protocol.
+
Typical usage is in conjunction with the `auth.type=HTTP` as replacement
of an Apache HTTP proxy layer as security enforcement on top of Gerrit
by returning a trusted username as HTTP Header.
+
Allow multiple values to install multiple servlet filters.
+
Example of using a security library secure.jar under $GERRIT_SITE/lib
that provides a org.anyorg.MySecureHeaderFilter Servlet Filter that enforces
a trusted username in the `TRUSTED_USER` HTTP Header and
org.anyorg.MySecureIPFilter that performs source IP security filtering:
+
----
[auth]
	type = HTTP
	httpHeader = TRUSTED_USER

[httpd]
	filterClass = org.anyorg.MySecureHeaderFilter
	filterClass = org.anyorg.MySecureIPFilter
----

[[filterClass.className.initParam]]filterClass.<className>.initParam::
+
Gerrit supports customized pluggable HTTP filters as `filterClass`. This
option allows to pass extra initialization parameters to the filter. It
allows for multiple key/value pairs to be passed in this pattern:
+
----
initParam = <key>=<value>
----
For a comprehensive example:
+
----
[httpd]
	filterClass = org.anyorg.AFilter
	filterClass = org.anyorg.BFilter
[filterClass "org.anyorg.AFilter"]
	key1 = value1
	key2 = value2
[filterClass "org.anyorg.BFilter"]
	key3 = value3
----

[[httpd.idleTimeout]]httpd.idleTimeout::
+
Maximum idle time for a connection, which roughly translates to the
TCP socket `SO_TIMEOUT`.
+
This value is interpreted as the maximum time between some progress
being made on the connection. So if a single byte is read or written,
then the timeout is reset.
+
The max idle time is applied:
+
* When waiting for a new message to be received on a connection
* When waiting for a new message to be sent on a connection

+
By default, 30 seconds.

[[httpd.robotsFile]]httpd.robotsFile::
+
Location of an external robots.txt file to be used instead of the one
bundled with the .war of the application.
+
If not absolute, the path is resolved relative to `$site_path`.
+
If the file doesn't exist or can't be read the default robots.txt file
bundled with the .war will be used instead.

[[httpd.registerMBeans]]httpd.registerMBeans::
+
Enable (or disable) registration of Jetty MBeans for Java JMX.
+
By default, false.

[[index]]
=== Section index

The index section configures the secondary index.

Note that after enabling the secondary index, the index must be built
using the link:pgm-reindex.html[reindex program] before restarting the
Gerrit server.

[[index.type]]index.type::
+
*(DEPRECATED)* The only supported value is `LUCENE`, which is the default,
that means a link:http://lucene.apache.org/[Lucene]
index is used.
+
For using other indexing backends (e.g. ElasticSearch), refer to
`gerrit.installIndexModule` setting.
+
[[index.threads]]index.threads::
+
Number of threads to use for indexing in normal interactive operations. Setting
it to 0 disables the dedicated thread pool and indexing will be done in the same
thread as the operation.
+
If not set or set to a zero, defaults to the number of logical CPUs as returned
by the JVM. If set to a negative value, defaults to a direct executor.

[[index.batchThreads]]index.batchThreads::
+
Number of threads to use for indexing in background operations, such as
online schema upgrades, and also the default for offline reindexing.
+
If not set or set to a zero, defaults to the number of logical CPUs as returned
by the JVM. If set to a negative value, defaults to a direct executor.

[[index.cacheQueryResultsByChangeNum]]index.cacheQueryResultsByChangeNum::
+
Allow to cache and reuse the change JSON elements by their Change number.
This improves the performance of queries that are returning Changes duplicates.
It needs to be turned off when having Changes imported from other servers
because of the potential conflicts of change numbers.
+
Defaults to true.

[[index.onlineUpgrade]]index.onlineUpgrade::
+
Whether to upgrade to new index schema versions while the server is
running. This is recommended as it prevents additional downtime during
Gerrit version upgrades (avoiding the need for an offline reindex step
using Reindex), but can add additional server load during the upgrade.
+
If set to false, there is no way to upgrade the index schema to take
advantage of new search features without restarting the server.
+
Defaults to true.

[[index.paginationType]]index.paginationType::
+
The pagination type to use when index queries are repeated to
obtain the next set of results. Supported values are:
+
* `OFFSET`
+
Index queries are repeated with a non-zero offset to obtain the
next set of results.
+
* `SEARCH_AFTER`
+
Index queries are repeated using a search-after object. Index
backends can provide their custom implementations for search-after.
Note that, `SEARCH_AFTER` does not impact using offsets in Gerrit
query APIs.
+
Defaults to `OFFSET`.

[[index.maxLimit]]index.maxLimit::
+
Maximum limit to allow for search queries. Requesting results above this
limit will truncate the list (but will still set `_more_changes` on
result lists). Set to 0 for no limit.
+
When `index.type` is set to `LUCENE`, defaults to no limit.

[[index.maxPages]]index.maxPages::
+
Maximum number of pages of search results to allow, as index
implementations may have to scan through large numbers of skipped
results when searching with an offset. Requesting results starting past
this threshold times the requested limit will result in an error. Set to
0 for no limit.
+
Defaults to no limit.

[[index.pageSizeMultiplier]]index.pageSizeMultiplier::
+
When index queries are repeated to obtain more results, this multiplier
will be used to determine the limit for the next query. Using a page
multiplier allows queries to start off small and thus provide good
latency for queries which may end up only having very few results, and
then scaling up to have better throughput to handle queries with larger
result sets without incurring the overhead of making as many queries as
would be required with a smaller limit. This strategy of using a multiplier
attempts to create a balance between latency and throughput by dynamically
adjusting the query size to the number of results being returned by each
query in the pagination.
+
The larger the multiplier, the better the throughput on large queries, and
it also improves latency on large queries by scaling up quickly. However, a
larger multiplier can hurt latencies a bit by making the "last" query in a
series longer than needed. The impact of this depends on how much the backend
latency goes up when specifying a large limit and few results are returned.
Setting link:#index.maxPageSize[index.maxPageSize] that isn't too large, can
likely help reduce the impacts of this.
+
For example, if the limit of the previous query was 500 and pageSizeMultiplier
is configured to 5, the next query will have a limit of 2500.
+
Defaults to 1 which effectively turns this feature off.

[[index.maxPageSize]]index.maxPageSize::
+
Maximum size to allow when index queries are repeated to obtain more results. Note
that, link:#index.maxLimit[index.maxLimit] will be used to limit page size if it
is configured to a value lower than maxPageSize.
+
For example, if the limit of previous query was 500, pageSizeMultiplier is
configured to 5 and maxPageSize to 2000, the next query will have a limit of
2000 (instead of 2500).
+
Defaults to no limit.

[[index.maxTerms]]index.maxTerms::
+
Maximum number of leaf terms to allow in a query. Too-large queries may
perform poorly, so setting this option causes query parsing to fail fast
before attempting to send them to the secondary index.
+
When the index type is `LUCENE`, also sets the maximum number of clauses
permitted per BooleanQuery. This is so that all enforced query limits
are the same.
+
Defaults to 1024.

[[index.autoReindexIfStale]]index.autoReindexIfStale::
+
Whether to automatically check if a document became stale in the index
immediately after indexing it. If false, there is a race condition during two
simultaneous writes that may cause one of the writes to not be reflected in the
index. The check to avoid this does consume some resources.
+
Defaults to false.

[[index.scheduledIndexer]]
==== Subsection index.scheduledIndexer

This section configures periodic indexing. Periodic indexing is
intended to run only on replicas and only updates the group index.
Replication to replicas happens on Git level so that Gerrit is not aware
of incoming replication events. But replicas need an updated group index
to resolve memberships of users for ACL validation. To keep the group
index in replicas up-to-date the Gerrit replica periodically scans the
group refs in the All-Users repository to reindex groups if they are
stale.

The scheduled reindexer is not able to detect group deletions that
happened while the replica was offline, but since group deletions are not
supported this should never happen. If nevertheless groups refs were
deleted while a replica was offline a full offline link:pgm-reindex.html[
reindex] must be performed.

This section is only used if Gerrit runs in replica mode, otherwise it is
ignored.

[[index.scheduledIndexer.runOnStartup]]index.scheduledIndexer.runOnStartup::
+
Whether the scheduled indexer should run once immediately on startup.
If set to `true` the replica startup is blocked until all stale groups
were reindexed. Enabling this allows to prevent that replicas that were
offline for a longer period of time run with outdated group information
until the first scheduled indexing is done.
+
Defaults to `true`.

[[index.scheduledIndexer.enabled]]index.scheduledIndexer.enabled::
+
Whether the scheduled indexer is enabled. If the scheduled indexer is
disabled you must implement other means to keep the group index for the
replica up-to-date.
+
Defaults to `true`.

[[index.scheduledIndexer.startTime]]index.scheduledIndexer.startTime::
+
The link:#schedule-configuration-startTime[start time] for running
the scheduled indexer.
+
Defaults to `00:00`.

[[index.scheduledIndexer.interval]]index.scheduledIndexer.interval::
+
The link:#schedule-configuration-interval[interval] for running
the scheduled indexer.
+
Defaults to `5m`.

link:#schedule-configuration-examples[Schedule examples] can be found
in the link:#schedule-configuration[Schedule Configuration] section.

==== Lucene configuration

Open and closed changes are indexed in separate indexes named
'open' and 'closed' respectively.

The following settings are only used when the index type is `LUCENE`.

[[index.name.ramBufferSize]]index.name.ramBufferSize::
+
Determines the amount of RAM that may be used for buffering added documents
and deletions before they are flushed to the index.  See the
link:http://lucene.apache.org/core/4_6_0/core/org/apache/lucene/index/LiveIndexWriterConfig.html#setRAMBufferSizeMB(double)[
Lucene documentation,role=external,window=_blank] for further details.
+
Defaults to 16M.

[[index.name.maxBufferedDocs]]index.name.maxBufferedDocs::
+
Determines the minimal number of documents required before the buffered
in-memory documents are flushed to the index. Large values generally
give faster indexing.  See the
link:http://lucene.apache.org/core/4_6_0/core/org/apache/lucene/index/LiveIndexWriterConfig.html#setMaxBufferedDocs(int)[
Lucene documentation,role=external,window=_blank] for further details.
+
Defaults to -1, meaning no maximum is set and the writer will flush
according to RAM usage.

[[index.name.commitWithin]]index.name.commitWithin::
+
Determines the period at which changes are automatically committed to
stable store on disk. This is a costly operation and may block
additional index writes, so lower with caution.
+
If zero, changes are committed after every write. This is very costly
but may be useful if offline reindexing is infeasible, or for development
servers.
+
Values can be specified using standard time unit abbreviations (`ms`, `sec`,
`min`, etc.).
+
If negative, `commitWithin` is disabled. Changes are flushed to disk when
the in-memory buffer fills, but only committed and guaranteed to be synced
to disk when the process finishes.
+
Defaults to 300000 ms (5 minutes).


[[index.name.maxMergeCount]]index.name.maxMergeCount::
+
Determines the max number of simultaneous merges that are allowed. If a merge
is necessary yet we already have this many threads running, the incoming thread
(that is calling add/updateDocument) will block until a merge thread has
completed.  Note that Lucene will only run the smallest maxThreadCount merges
at a time. See the
link:https://lucene.apache.org/core/5_5_0/core/org/apache/lucene/index/ConcurrentMergeScheduler.html#setDefaultMaxMergesAndThreads(boolean)[
Lucene documentation,role=external,window=_blank] for further details.
+
Defaults to -1 for (auto detection).


[[index.name.maxThreadCount]]index.name.maxThreadCount::
+
Determines the max number of simultaneous Lucene merge threads that should be running at
once. This must be less than or equal to maxMergeCount. See the
link:https://lucene.apache.org/core/5_5_0/core/org/apache/lucene/index/ConcurrentMergeScheduler.html#setDefaultMaxMergesAndThreads(boolean)[
Lucene documentation,role=external,window=_blank] for further details.
+
For further details on Lucene index configuration (auto detection) which
affects maxThreadCount and maxMergeCount settings.
See the
link:https://lucene.apache.org/core/5_5_0/core/org/apache/lucene/index/ConcurrentMergeScheduler.html#AUTO_DETECT_MERGES_AND_THREADS[
Lucene documentation,role=external,window=_blank]
+
Defaults to -1 for (auto detection).

[[index.name.enableAutoIOThrottle]]index.name.enableAutoIOThrottle::
+
Allows the control of whether automatic IO throttling is enabled and used by
default in the lucene merge queue.  Automatic dynamic IO throttling, which when
on is used to adaptively rate limit writes bytes/sec to the minimal rate necessary
so merges do not fall behind. See the
link:https://lucene.apache.org/core/5_5_0/core/org/apache/lucene/index/ConcurrentMergeScheduler.html#enableAutoIOThrottle()[
Lucene documentation,role=external,window=_blank] for further details.
+
Defaults to true (throttling enabled).

During offline reindexing, setting ramBufferSize greater than the size
of index (size of specific index folder under <site_dir>/index) and
maxBufferedDocs as -1 avoids unnecessary flushes and triggers only a
single flush at the end of the process.

Sample Lucene index configuration:
----
[index]
  type = LUCENE

[index "changes_open"]
  ramBufferSize = 60 m
  maxBufferedDocs = 3000
  maxThreadCount = 5
  maxMergeCount = 50


[index "changes_closed"]
  ramBufferSize = 20 m
  maxBufferedDocs = 500
  maxThreadCount = 10
  maxMergeCount = 100
  enableIOThrottle = false

----

[[event]]
=== Section event

[[event.payload.listChangeOptions]]events.payload.listChangeOptions::
+
List of options that Gerrit applies when rendering the payload of an
internal event. This is the same set of options that are documented
link:rest-api-changes.html#query-options[here].
+
Depending on the setup, these events might get serialized using stream
events.
+
This can be set to the set of minimal options that consumers of Gerrit's
events need. A minimal set would be (`SKIP_DIFFSTAT`).
+
Every option that gets added here will have a performance impact. The
general recommendation is therefore to set this to a minimal set of
required options.
+
Defaults to all available options minus `CHANGE_ACTIONS`,
`CURRENT_ACTIONS` and `CHECK`. This is a rich default to make sure the
config is backwards compatible with what the default was before the config
was added.

[[event.comment-added.publishPatchSetLevelComment]]event.comment-added.publishPatchSetLevelComment::
+
Add patch set level comment as event comment. Without this option, patch set
level comment will not be included in the event comment attribute. Given that
currently patch set level, file and robot comments are not exposed in the
`comment-added` event type, those comments will be lost. One particular use
case is to re-trigger CI build from the change screen by adding a comment with
specific content, e.g.: `recheck`. Jenkins Gerrit Trigger plugin and Zuul CI
depend on this feature to trigger change verification.
+
By default, true.

[[experiments]]
=== Section experiments

This section covers experimental new features. Gerrit uses experiments
to research new behavior in frontend and core backend. Once the research is done, the experimental
feature either stays and the experimentation flag gets removed, or the feature as a whole
gets removed

[[experiments.enabled]]experiments.enabled::
+
List of experiments that are currently enabled. The release notes contain currently
available experiments.
+
We will not remove experiments in stable patch releases. They are likely to be
removed in the next stable version.

----
[experiments]
  enabled = ExperimentKey
----

[[experiments.disabled]]experiments.disabled::
+
List of experiments that are currently disabled. The release notes contain currently
available experiments. This list disables experiments with the given key that are
either enabled by default or explicitly in the config.

----
[experiments]
  disabled = ExperimentKey
----

[[ldap]]
=== Section ldap

LDAP integration is only enabled if `auth.type` is set to
`HTTP_LDAP`, `LDAP` or `CLIENT_SSL_CERT_LDAP`.  See above for a
detailed description of the `auth.type` settings and their
implications.

An example LDAP configuration follows, and then discussion of
the parameters introduced here.  Suitable defaults for most
parameters are automatically guessed based on the type of server
detected during startup.  The guessed defaults support
link:http://www.ietf.org/rfc/rfc2307.txt[RFC 2307,role=external,window=_blank], Active
Directory and link:https://www.freeipa.org[FreeIPA,role=external,window=_blank].

----
[ldap]
  server = ldap://ldap.example.com

  accountBase = ou=people,dc=example,dc=com
  accountPattern = (&(objectClass=person)(uid=${username}))
  accountFullName = displayName
  accountEmailAddress = mail

  groupBase = ou=groups,dc=example,dc=com
  groupMemberPattern = (&(objectClass=group)(member=${dn}))
----

[[ldap.guessRelevantGroups]]ldap.guessRelevantGroups::
+
Filter the groups found in LDAP by guessing the ones relevant to
Gerrit and removing the others from list completions and ACL evaluations.
The guess is based on two elements: the projects most recently
accessed in the cache and the list of LDAP groups included in their ACLs.
+
Please note that projects rarely used and thus not cached may be
temporarily inaccessible by users even with LDAP membership and grants
referenced in the ACLs.
+
By default, true.

[[ldap.server]]ldap.server::
+
URL of the organization's LDAP server to query for user information
and group membership from.  Must be of the form `ldap://host` or
`ldaps://host` to bind with either a plaintext or SSL connection.
+
If `auth.type` is `LDAP` this setting should use `ldaps://` to
ensure the end user's plaintext password is transmitted only over
an encrypted connection.
+
If you want to configure multiple ldap servers you can try to put
multiple ldap urls separated by a space:
`server = ldaps://ldap1 ldaps://ldap2`
See https://bugs.chromium.org/p/gerrit/issues/detail?id=10841[issue 10841].

[[ldap.startTls]]ldap.startTls::
+
If true, Gerrit will perform StartTLS extended operation.
+
By default, false, StartTLS will not be enabled.

[[ldap.supportAnonymous]]ldap.supportAnonymous::
+
If false, Gerrit will provide credentials only at connection open, this is
required for some `LDAP` implementations that do not allow anonymous bind
for StartTLS or for reauthentication.
+
By default, true.

[[ldap.sslVerify]]ldap.sslVerify::
+
If false and ldap.server is an `ldaps://` style URL or `ldap.startTls`
is true, Gerrit will not verify the server certificate when it connects
to perform a query.
+
By default, true, requiring the certificate to be verified.

[[ldap.groupsVisibleToAll]]ldap.groupsVisibleToAll::
+
If true, LDAP groups are visible to all registered users.
+
By default, false, LDAP groups are visible only to administrators and
group members.

[[ldap.username]]ldap.username::
+
_(Optional)_ Username to bind to the LDAP server with.  If not set,
an anonymous connection to the LDAP server is attempted.

[[ldap.password]]ldap.password::
+
_(Optional)_ Password for the user identified by `ldap.username`.
If not set, an anonymous (or passwordless) connection to the LDAP
server is attempted.

[[ldap.referral]]ldap.referral::
+
_(Optional)_ How an LDAP referral should be handled if it is
encountered during directory traversal.  Set to `follow` to
automatically follow any referrals, or `ignore` to ignore the
referrals.
+
By default, `ignore`.

[[ldap.readTimeout]]ldap.readTimeout::
+
_(Optional)_ The read timeout for an LDAP operation. The value is
in the usual time-unit format like "1 s", "100 ms", etc...
A timeout can be used to avoid blocking all of the SSH command start
threads in case the LDAP server becomes slow.
+
By default there is no timeout and Gerrit will wait for the LDAP
server to respond until the TCP connection times out.

[[ldap.accountBase]]ldap.accountBase::
+
Root of the tree containing all user accounts.  This is typically
of the form `ou=people,dc=example,dc=com`.
+
This setting may be added multiple times to specify more than
one root.

[[ldap.accountScope]]ldap.accountScope::
+
Scope of the search performed for accounts.  Must be one of:
+
* `one`: Search only one level below accountBase, but not recursive
* `sub` or `subtree`: Search recursively below accountBase
* `base` or `object`: Search exactly accountBase; probably not desired

+
Default is `subtree` as many directories have several levels.

[[ldap.accountPattern]]ldap.accountPattern::
+
Query pattern to use when searching for a user account.  This may be
any valid LDAP query expression, including the standard `(&...)` and
`(|...)` operators.  If `auth.type` is `HTTP_LDAP` then the variable
`${username}` is replaced with a parameter set to the username
that was supplied by the HTTP server.  If `auth.type` is `LDAP` then
the variable `${username}` is replaced by the string entered by
the end user.
+
This pattern is used to search the objects contained directly under
the `ldap.accountBase` tree.  A typical setting for this parameter
is `(uid=${username})` or `(cn=${username})`, but the proper
setting depends on the LDAP schema used by the directory server.
+
Default is `(uid=${username})` for FreeIPA and RFC 2307 servers,
and `(&(objectClass=user)(sAMAccountName=${username}))`
for Active Directory.

[[ldap.accountFullName]]ldap.accountFullName::
+
_(Optional)_ Name of an attribute on the user account object which
contains the initial value for the user's full name field in Gerrit.
Typically this is the `displayName` property in LDAP, but could
also be `legalName` or `cn`.
+
Attribute values may be concatenated with literal strings.  For
example to join given name and surname together, use the pattern
`${givenName} ${SN}`.
+
If set, users will be unable to modify their full name field, as
Gerrit will populate it only from the LDAP data.
+
Default is `displayName` for FreeIPA and RFC 2307 servers,
and `${givenName} ${sn}` for Active Directory.

[[ldap.accountEmailAddress]]ldap.accountEmailAddress::
+
_(Optional)_ Name of an attribute on the user account object which
contains the user's Internet email address, as defined by this
LDAP server.
+
Attribute values may be concatenated with literal strings,
for example to set the email address to the lowercase form
of sAMAccountName followed by a constant domain name, use
`${sAMAccountName.toLowerCase}@example.com`.
+
If set, the preferred email address will be prefilled from LDAP,
but users may still be able to register additional email addresses,
and select a different preferred email address.
+
Default is `mail`.

[[ldap.accountSshUserName]]ldap.accountSshUserName::
+
_(Optional)_ Name of an attribute on the user account object which
contains the initial value for the user's SSH username field in
Gerrit.  Typically this is the `uid` property in LDAP, but could
also be `cn`.  Administrators should prefer to match the attribute
corresponding to the user's workstation username, as this is what
SSH clients will default to.
+
Attribute values may also be forced to lowercase, or to uppercase in
an expression.  For example, `${sAMAccountName.toLowerCase}` will
force the value of sAMAccountName, if defined, to be all lowercase.
The suffix `.toUpperCase` can be used for the other direction.
The suffix `.localPart` can be used to split attribute values of
the form 'user@example.com' and return only the left hand side, for
example `${userPrincipalName.localPart}` would provide only 'user'.
+
If set, users will be unable to modify their SSH username field, as
Gerrit will populate it only from the LDAP data. Note that once the
username has been set it cannot be changed, therefore it is
recommended not to make changes to this setting that would cause the
value to differ, as this will prevent users from logging in.
+
Default is `uid` for FreeIPA and RFC 2307 servers,
and `${sAMAccountName.toLowerCase}` for Active Directory.

[[ldap.accountMemberField]]ldap.accountMemberField::
+
_(Optional)_ Name of an attribute on the user account object which
contains the groups the user is part of. Typically used for Active
Directory and FreeIPA servers.
+
Default is unset for RFC 2307 servers (disabled)
and `memberOf` for Active Directory and FreeIPA.

[[ldap.accountMemberExpandGroups]]ldap.accountMemberExpandGroups::
+
_(Optional)_ Whether to expand nested groups recursively. This
setting is used only if `ldap.accountMemberField` is set.
+
Default is unset for FreeIPA and `true` for RFC 2307 servers
and Active Directory.

[[ldap.fetchMemberOfEagerly]]ldap.fetchMemberOfEagerly::
+
_(Optional)_ Whether to fetch the `memberOf` account attribute on
login. Setups which use LDAP for user authentication but don't make
use of the LDAP groups may benefit from setting this option to `false`
as this will result in a much faster LDAP login.
+
Default is unset for RFC 2307 servers (disabled) and `true` for
Active Directory and FreeIPA.

[[ldap.groupBase]]ldap.groupBase::
+
Root of the tree containing all group objects.  This is typically
of the form `ou=groups,dc=example,dc=com`.
+
This setting may be added multiple times to specify more than
one root.

[[ldap.groupScope]]ldap.groupScope::
+
Scope of the search performed for group objects.  Must be one of:
+
* `one`: Search only one level below groupBase, but not recursive
* `sub` or `subtree`: Search recursively below groupBase
* `base` or `object`: Search exactly groupBase; probably not desired

+
Default is `subtree` as many directories have several levels.

[[ldap.groupPattern]]ldap.groupPattern::
+
Query pattern used when searching for an LDAP group to connect
to a Gerrit group.  This may be any valid LDAP query expression,
including the standard `(&...)` and `(|...)` operators.  The variable
`${groupname}` is replaced with the search term supplied by the
group owner.
+
Default is `(cn=${groupname})` for FreeIPA and RFC 2307 servers,
and `(&(objectClass=group)(cn=${groupname}))` for Active Directory.

[[ldap.groupMemberPattern]]ldap.groupMemberPattern::
+
Query pattern to use when searching for the groups that a user
account is currently a member of.  This may be any valid LDAP query
expression, including the standard `(&...)` and `(|...)` operators.
+
If `auth.type` is `HTTP_LDAP` then the variable `${username}` is
replaced with a parameter set to the username that was supplied
by the HTTP server.  Other variables appearing in the pattern,
such as `${fooBarAttribute}`, are replaced with the value of the
corresponding attribute (in this case, `fooBarAttribute`) as read
from the user's account object matched under `ldap.accountBase`.
Attributes such as `${dn}` or `${uidNumber}` may be useful.
+
Default is `(|(memberUid=${username})(gidNumber=${gidNumber}))` for
RFC 2307, and unset (disabled) for Active Directory and FreeIPA.

[[ldap.groupName]]ldap.groupName::
+
_(Optional)_ Name of the attribute on the group object which contains
the value to use as the group name in Gerrit.
+
Typically the attribute name is `cn` for RFC 2307 and Active Directory
servers.  For other servers the attribute name may differ, for example
`apple-group-realname` on Apple MacOS X Server.
+
It is also possible to specify a literal string containing a pattern of
attribute values.  For example to create a Gerrit group name consisting of
LDAP group name and group ID, use the pattern `${cn} (${gidNumber})`.
+
Default is `cn`.

[[ldap.mandatoryGroup]]ldap.mandatoryGroup::
+
All users must be a member of this group to allow account creation or
authentication.
+
Setting mandatoryGroup implies enabling of `ldap.fetchMemberOfEagerly`
+
By default, unset.

[[ldap.localUsernameToLowerCase]]ldap.localUsernameToLowerCase::
+
Converts the local username, that is used to login into the Gerrit
Web UI, to lower case before doing the LDAP authentication. By setting
this parameter to true, a case insensitive login to the Gerrit Web UI
can be achieved.
+
If set, it must be ensured that the local usernames for all existing
accounts are converted to lower case, otherwise a user that has a
local username that contains upper case characters will not be able to login
anymore. The local usernames for the existing accounts can be
converted to lower case by running the server program
link:pgm-LocalUsernamesToLowerCase.html[LocalUsernamesToLowerCase].
Please be aware that the conversion of the local usernames to lower
case can't be undone. For newly created accounts the local username
will be directly stored in lower case.
+
By default, unset/false.

[[ldap.authentication]]ldap.authentication::
+
Defines how Gerrit authenticates with the server. When set to `GSSAPI`
Gerrit will use Kerberos. To use kerberos the
`java.security.auth.login.config` system property must point to a
login to a JAAS configuration file and, if Java 6 is used, the system
property `java.security.krb5.conf` must point to the appropriate
krb5.ini file with references to the KDC.

Typical jaas.conf.

----
KerberosLogin {
    com.sun.security.auth.module.Krb5LoginModule
            required
            useTicketCache=true
            doNotPrompt=true
            renewTGT=true;
};
----

See Java documentation on how to create the krb5.ini file.

Note the `renewTGT` property to make sure the TGT does not expire,
and `useTicketCache` to use the TGT supplied by the operating system. As
the whole point of using GSSAPI is to have passwordless authentication
to the LDAP service, this option does not acquire a new TGT on its own.

On Windows servers the registry key `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters`
must have the DWORD value `allowtgtsessionkey` set to 1 and the account must not
have local administrator privileges.

[[ldap.useConnectionPooling]]ldap.useConnectionPooling::
+
_(Optional)_ Enable the LDAP connection pooling or not.
+
If it is true, the LDAP service provider maintains a pool of (possibly)
previously used connections and assigns them to a Context instance as
needed. When a Context instance is done with a connection (closed or
garbage collected), the connection is returned to the pool for future use.
+
For details, see link:http://docs.oracle.com/javase/tutorial/jndi/ldap/pool.html[
LDAP connection management (Pool),role=external,window=_blank] and link:http://docs.oracle.com/javase/tutorial/jndi/ldap/config.html[
LDAP connection management (Configuration),role=external,window=_blank]
+
By default, false.

[[ldap.connectTimeout]]ldap.connectTimeout::
+
_(Optional)_ Timeout period for establishment of an LDAP connection.
+
The value is in the usual time-unit format like "1 s", "100 ms",
etc...
+
By default there is no timeout and Gerrit will wait indefinitely.

[[ldap-connection-pooling]]
==== LDAP Connection Pooling
Once LDAP connection pooling is enabled by setting the link:#ldap.useConnectionPooling[
ldap.useConnectionPooling] configuration property to `true`, the connection pool
can be configured using JVM system properties as explained in the
link:http://docs.oracle.com/javase/7/docs/technotes/guides/jndi/jndi-ldap.html#POOL[
Java SE Documentation,role=external,window=_blank].

For standalone Gerrit (running with the embedded Jetty), JVM system properties
are specified in the link:#container[container section]:

----
  javaOptions = -Dcom.sun.jndi.ldap.connect.pool.maxsize=20
  javaOptions = -Dcom.sun.jndi.ldap.connect.pool.prefsize=10
  javaOptions = -Dcom.sun.jndi.ldap.connect.pool.timeout=300000
----

[[lfs]]
=== Section lfs

[[lfs.plugin]]lfs.plugin::
+
The name of a plugin which serves the
link:https://github.com/github/git-lfs/blob/master/docs/api/v1/http-v1-batch.md[
LFS protocol,role=external,window=_blank] on the `<project-name>/info/lfs/objects/batch` endpoint. When
not configured Gerrit will respond with `501 Not Implemented` on LFS protocol
requests.
+
By default unset.

[[log]]
=== Section log

[[log.jsonLogging]]log.jsonLogging::
+
If set to true, enables error, ssh and http logging in JSON format (file names:
`logs/error_log.json`, `logs/sshd_log.json` and `logs/httpd_log.json`).
+
The option only applies to Gerrit built-in loggers. It is ignored when a log4j
configuration is specified via
link:#container.javaOptions[container.javaOptions], for example
`-Dlog4j.configuration=file://etc/log4j.properties`.
+
Defaults to false.

[[log.textLogging]]log.textLogging::
+
If set to true, enables error logging in regular plain text format. Can only be disabled
if `jsonLogging` is enabled.
+
The option only applies to Gerrit built-in loggers. It is ignored when a log4j
configuration is specified via
link:#container.javaOptions[container.javaOptions], for example
`-Dlog4j.configuration=file://etc/log4j.properties`.
+
Defaults to true.

[[log.compress]]log.compress::
+
If set to true, log files are compressed at server startup and then daily at 11pm
(in the server's local time zone).
+
Defaults to true.

[[log.rotate]]log.rotate::
+
If set to true, log files are rotated daily at midnight (GMT).
+
Defaults to true.

[[metrics]]
=== Section metrics

[[metrics.reservoir]]metrics.reservoir::
+
The type of data reservoir used by the metrics system to calculate the percentile
values for timers and histograms.
It can be set to one of the following values:
+
* ExponentiallyDecaying: An exponentially-decaying random reservoir based on
  Cormode et al's forward-decaying priority reservoir sampling method to produce
  a statistically representative sampling reservoir, exponentially biased towards
  newer entries.
* SlidingTimeWindowArray: A sliding window that stores only the measurements made
  in the last window using chunks of 512 samples.
* SlidingTimeWindow: A sliding window that stores only the measurements made in
  the last window using a skip list.
* SlidingWindow: A sliding window that stores only the last measurements.
* Uniform: A random sampling reservoir that uses Vitter's Algorithm R to produce
  a statistically representative sample.
+
Defaults to ExponentiallyDecaying.

[[metrics.ExponentiallyDecaying.alpha]]metrics.ExponentiallyDecaying.alpha::
+
The exponential decay factor; the higher this is, the more biased the reservoir
will be towards newer values.

[[metrics.reservoirType.size]]metrics.<reservoirType>.size::
+
The number of samples to keep in the reservoir. Applies to all reservoir types
except the sliding time-based ones.
+
Defaults to 1028.

[[metrics.reservoirType.window]]metrics.<reservoirType>.window::
+
The window of time for keeping data in the reservoir. It only applies to sliding
time-based reservoir types.

[[mimetype]]
=== Section mimetype

[[mimetype.name.safe]]mimetype.<name>.safe::
+
If set to true, files with the MIME type `<name>` will be sent as
direct downloads to the user's browser, rather than being wrapped up
inside of zipped archives.  The type name may be a complete type
name, e.g. `image/gif`, a generic media type, e.g. `+image/*+`,
or the wildcard `+*/*+` to match all types.
+
By default, false for all MIME types.

Common examples:
----
[mimetype "image/*"]
  safe = true

[mimetype "application/pdf"]
  safe = true

[mimetype "application/msword"]
  safe = true

[mimetype "application/vnd.ms-excel"]
  safe = true
----

[[note-db]]
=== Section noteDb

NoteDb is the Git-based database storage backend for Gerrit. For more
information, including how to migrate data from an older Gerrit version, see the
link:note-db.html[documentation].

[[notedb.accounts.sequenceBatchSize]]notedb.accounts.sequenceBatchSize::
+
The next available account sequence number is stored as UTF-8 text in a
blob pointed to by the `refs/sequences/accounts` ref in the `All-Users`
repository. Multiple processes share the same sequence by incrementing
the counter using normal git ref updates. To amortize the cost of these
ref updates, processes increment the counter by a larger number and
hand out numbers from that range in memory until they run out. This
configuration parameter controls the size of the account ID batch that
each process retrieves at once.
+
By default, 1.

[[notedb.changes.sequenceBatchSize]]notedb.changes.sequenceBatchSize::
+
The next available change sequence number is stored as UTF-8 text in a
blob pointed to by the `refs/sequences/changes` ref in the `All-Projects`
repository. Multiple processes share the same sequence by incrementing
the counter using normal git ref updates. To amortize the cost of these
ref updates, processes increment the counter by a larger number and
hand out numbers from that range in memory until they run out. This
configuration parameter controls the size of the change ID batch that
each process retrieves at once.
+
By default, 20.

[[oauth]]
=== Section oauth

OAuth integration is only enabled if `auth.type` is set to `OAUTH`. See
link:#auth.type[above] for a detailed description of the `auth.type` settings
and their implications.

By default, contact information, like the full name and email address,
is retrieved from the selected OAuth provider when a user account is created,
or when a user requests to reload that information in the settings UI. If
that is not supported by the OAuth provider, users can be allowed to edit
their contact information manually.

[[oauth.allowEditFullName]]oauth.allowEditFullName::
+
If true, the full name can be edited in the contact information.
+
Default is false.

[[oauth.allowRegisterNewEmail]]oauth.allowRegisterNewEmail::
+
If true, additional email addresses can be registered in the contact
information.
+
Default is false.

[[operator-alias]]
=== Section operator alias

Operator aliasing allows global aliases to be defined for query operators.
Currently only change queries are supported. The alias name is the git
config key name, and the operator being aliased is the git config value.

For example:

----
[operator-alias "change"]
  oldage = age
  number = change
----

This section is particularly useful to alias operator names which may be
long and clunky because they include a plugin name in them to a shorter
name without the plugin name.

Aliases are resolved dynamically at invocation time to any currently
loaded versions of plugins. If the alias points to an operator provided
by a plugin which is not currently loaded, or the plugin does not define
the operator, then "unsupported operator" is returned to the user.

Aliases will override existing operators. In the case of multiple aliases
with the same name, the last one defined will be used.

When the target of an alias doesn't exist, the operator with the name
of the alias will be used (if present). This enables an admin to config
the system to override a core operator with an operator provided by a
plugin when present and otherwise fall back to the operator provided by
core.

[[pack]]
=== Section pack

Global settings controlling how Gerrit Code Review creates pack
streams for Git clients running clone, fetch, or pull.  Most of these
variables are per-client request, and thus should be carefully set
given the expected concurrent request load and available CPU and
memory resources.

[[pack.deltacompression]]pack.deltacompression::
+
If true, delta compression between objects is enabled.  This may
result in a smaller overall transfer for the client, but requires
more server memory and CPU time.
+
False (off) by default, matching Gerrit Code Review 2.1.4.

[[pack.threads]]pack.threads::
+
Maximum number of threads to use for delta compression (if enabled).
This is per-client request.  If set to 0 then the number of CPUs is
auto-detected and one thread per CPU is used, per client request.
+
By default, 1.


[[plugins]]
=== Section plugins

[[plugins.checkFrequency]]plugins.checkFrequency::
+
How often plugins should be examined for new plugins to load, removed
plugins to be unloaded, or updated plugins to be reloaded.  Values can
be specified using standard time unit abbreviations ('ms', 'sec',
'min', etc.).
+
If set to 0, automatic plugin reloading is disabled.  Administrators
may force reloading with link:cmd-plugin-reload.html[gerrit plugin reload].
+
Default is 1 minute.

[[plugins.allowRemoteAdmin]]plugins.allowRemoteAdmin::
+
Enable remote installation, enable and disable of plugins over HTTP
and SSH.  If set to true Administrators can install new plugins
remotely, or disable existing plugins.  Defaults to false.

[[plugins.mandatory]]plugins.mandatory::
+
List of mandatory plugins. If a plugin from this list does not load,
Gerrit will fail to start.
+
Disabling and restarting of a mandatory plugin is rejected, but reloading
of a mandatory plugin is still possible.

[[plugins.jsLoadTimeout]]plugins.jsLoadTimeout::
+
Set the timeout value for loading JavaScript plugins in Gerrit UI.
Values can be specified using standard time unit abbreviations ('ms',
'sec', 'min', etc.).
+
Default is 5 seconds. Negative values will be converted to 0.

[[plugins.transitionalPushOptions]]plugins.transitionalPushOptions::
+
Additional push options which should be accepted by gerrit as valid
options even if they are not registered by any plugin(e.g. "myplugin~foo").
+
This config can be used when gerrit migrates from a deprecated plugin to the new one. The new plugin
can (temporary) accept push options of the old plugin without registering such options.

[[receive]]
=== Section receive

This section is used to configure behavior of the 'receive-pack'
handler, which responds to 'git push' requests.

[[receive.allowGroup]]receive.allowGroup::
+
Name of the groups of users that are allowed to execute
'receive-pack' on the server. One or more groups can be set.
+
If no groups are added, any user will be allowed to execute
'receive-pack' on the server.

[[receive.certNonceSeed]]receive.certNonceSeed::
+
If set to a non-empty value and server-side signed push validation is
link:#receive.enableSignedPush[enabled], use this value as the seed to
the HMAC SHA-1 nonce generator. If unset, a 64-byte random seed will be
generated at server startup.
+
As this is used as the seed of a cryptographic algorithm, it is
recommended to be placed in link:#secure-config[`secure.config`].
+
Defaults to unset.

[[receive.certNonceSlop]]receive.certNonceSlop::
+
When validating the nonce passed as part of the signed push protocol,
accept valid nonces up to this many seconds old. This allows
certificate verification to work over HTTP where there is a lag between
the HTTP response providing the nonce to sign and the next request
containing the signed nonce. This can be significant on large
repositories, since the lag also includes the time to count objects on
the client.
+
Default is 5 minutes.

[[receive.checkMagicRefs]]receive.checkMagicRefs::
+
If true, Gerrit will verify the destination repository has
no references under the magic 'refs/for' branch namespace. Names under
these locations confuse clients when trying to upload code reviews so
Gerrit requires them to be empty.
+
If false Gerrit skips the sanity check and assumes administrators
have ensured the repository does not contain any magic references.
Setting to false to skip the check can decrease latency during push.
+
Default is true.

[[receive.allowProjectOwnersToChangeParent]]receive.allowProjectOwnersToChangeParent::
+
If true, Gerrit will allow project owners to change the parent of a project.
+
By default only Gerrit administrators are allowed to change the parent
of a project. By allowing project owners to change parents, it may
allow the owner to circumvent certain enforced rules (like important
BLOCK rules).
+
Default is false.
+
This value supports configuration reloads:
link:cmd-reload-config.html[reload-config]

[[receive.checkReferencedObjectsAreReachable]]receive.checkReferencedObjectsAreReachable::
+
If set to true, Gerrit will validate that all referenced objects that
are not included in the received pack are reachable by the user.
+
Carrying out this check on gits with many refs and commits can be a
very CPU-heavy operation. For non public Gerrit-servers this check may
be overkill.
+
Only disable this check if you trust the clients not to forge SHA-1
references to access commits intended to be hidden from the user.
+
Default is true.

[[receive.enableInMemoryRefCache]]receive.enableInMemoryRefCache::
+
If true, Gerrit will cache all refs advertised during push in memory and
base later receive operations on that cache.
+
Turning this cache off is considered experimental.
+
This cache provides value when the ref database is slow and/or does not
offer an inverse lookup of object ID to ref name. When RefTable is used,
this cache can be turned off (experimental) to get speed improvements.
+
Default is true.

[[receive.enableSignedPush]]receive.enableSignedPush::
+
If true, server-side signed push validation is enabled.
+
When a client pushes with `git push --signed`, this ensures that the
push certificate is valid and signed with a valid public key stored in
the `refs/meta/gpg-keys` branch of `All-Users`.
+
Defaults to false.

[[receive.maxBatchChanges]]receive.maxBatchChanges::
+
The maximum number of changes that Gerrit allows to be pushed
in a batch for review. When this number is exceeded Gerrit rejects
the push with an error message.
+
May be overridden for certain groups by specifying a limit in the
link:access-control.html#capability_batchChangesLimit['Batch Changes Limit']
global capability.
+
This setting can be used to prevent users from uploading large
number of changes for review by mistake.
+
Default is zero, no limit.

[[receive.maxBatchCommits]]receive.maxBatchCommits::
+
The maximum number of commits that Gerrit allows to be pushed in a batch
directly to a branch when link:user-upload.html#bypass_review[bypassing review].
This limit can be bypassed if a user link:user-upload.html#skip_validation[skips
validation].
+
Default is 10000.

[[receive.maxObjectSizeLimit]]receive.maxObjectSizeLimit::
+
Maximum allowed Git object size that 'receive-pack' will accept.
If an object is larger than the given size the pack-parsing will abort
and the push operation will fail. If set to zero then there is no
limit.
+
Gerrit administrators can use this setting to prevent developers
from pushing objects which are too large to Gerrit.
+
This setting can also be set in the `project.config`
(link:config-project-config.html[receive.maxObjectSizeLimit]) in order
to further reduce the global setting. The project specific setting is
only honored when it further reduces the global limit.
+
Default is zero.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.

[[receive.inheritProjectMaxObjectSizeLimit]]receive.inheritProjectMaxObjectSizeLimit::
+
Controls whether the project-level link:config-project-config.html[`receive.maxObjectSizeLimit`]
value is inherited from the parent project. When `true`, the value is
inherited, otherwise it is not inherited.
+
Default is false, the value is not inherited.

[[receive.maxTrustDepth]]receive.maxTrustDepth::
+
If signed push validation is link:#receive.enableSignedPush[enabled],
set to the maximum depth to search when checking if a key is
link:#receive.trustedKey[trusted].
+
Default is 0, meaning only explicitly trusted keys are allowed.

[[receive.threadPoolSize]]receive.threadPoolSize::
+
Maximum size of the thread pool in which the change data in received packs is
processed.
+
Defaults to the number of available CPUs according to the Java runtime.

[[receive.timeout]]receive.timeout::
+
Overall timeout on the time taken to process the change data in
received packs. Only includes the time processing Gerrit changes
and updating references, not the time to index the pack. Values can
be specified using standard time unit abbreviations ('ms', 'sec',
'min', etc.).
+
After the timeout is exceeded the task processing the receive gets a
cancellation signal that allows the tast to finish gracefully.
link:#receive.cancellationTimeout[receive.cancellationTimeout]
defines how much time the task has to react to the cancellation signal
before it is focefully cancelled.
+
The receive timeout cannot be overriden by setting a higher
link:user-upload.html#deadline[deadline] on the git push request.
+
Default is 4 minutes. If no unit is specified, milliseconds
is assumed.

[[receive.cancellationTimeout]]receive.cancellationTimeout::
+
Defines the time that a receive task has to react to a cancellation
signal and finish gracefully after link:#receive.timeout[receive.timeout]
is exceeded. If the receive task is still not terminated after the
cancellation timeout is exceeded the task is forcefully cancelled.
Values can be specified using standard time unit abbreviations ('ms',
'sec', 'min', etc.).
+
Default is 5 seconds. If no unit is specified, milliseconds is assumed.

[[receive.trustedKey]]receive.trustedKey::
+
List of GPG key fingerprints that should be considered trust roots by
the server when signed push validation is
link:#receive.enableSignedPush[enabled]. A key is trusted by the server
if it is either in this list, or a path of trust signatures leads from
the key to a configured trust root. The maximum length of the path is
determined by link:#receive.maxTrustDepth[`receive.maxTrustDepth`].
+
Key fingerprints can be displayed with `gpg --list-keys
--with-fingerprint`.
+
Trust signatures can be added to a key using the `tsign` command to
link:https://www.gnupg.org/documentation/manuals/gnupg/OpenPGP-Key-Management.html[
`gpg --edit-key`,role=external,window=_blank], after which the signed key should be re-uploaded.
+
If no keys are specified, web-of-trust checks are disabled. This is the
default behavior.

[[repository]]
=== Section repository

Repositories in this sense are the same as projects.

In the following example configuration `Registered Users` is set
to be the default owner of new projects.

----
[repository "*"]
  ownerGroup = Registered Users
----

The only matching patterns supported are exact match or wildcard matching which
can be specified by ending the name with a `*`. If a project matches more than one
repository configuration, then the configuration from the more precise match
will be used. In the following example, the default submit type for a project
named `project/plugins/a` would be `CHERRY_PICK`.

----
[repository "project/*"]
  defaultSubmitType = MERGE_IF_NECESSARY
[repository "project/plugins/*"]
  defaultSubmitType = CHERRY_PICK
----

[NOTE]
All properties are used from the matching repository configuration. In
the previous example, all properties will be used from `project/plugins/\*`
section and no properties will be inherited nor overridden from `project/*`.

[[repository.name.basePath]]repository.<name>.basePath::
+
Alternate to <<gerrit.basePath,gerrit.basePath>>. The repository will be created
and used from this location instead: ${alternateBasePath}/${projectName}.git.
+
If configuring the basePath for an existing project in gerrit, make sure to stop
gerrit, move the repository in the alternate basePath, configure basePath for
this repository and then start Gerrit.
+
Path must be absolute.

[[repository.name.defaultSubmitType]]repository.<name>.defaultSubmitType::
+
The default submit type for newly created projects. Supported values
are `INHERIT`, `MERGE_IF_NECESSARY`, `FAST_FORWARD_ONLY`, `REBASE_IF_NECESSARY`,
`REBASE_ALWAYS`, `MERGE_ALWAYS` and `CHERRY_PICK`.
+
For more details see link:config-project-config.html#submit-type[Submit Types].
+
Default is link:config-project-config.html#submit_type_inherit[`INHERIT`].
+
This submit type is only applied at project creation time if a submit type is
omitted from the link:rest-api-projects.html#project-input[ProjectInput]. If the
submit type is unset in the project config at runtime, for backwards
compatibility purposes, it defaults to
link:project-configuration.html#merge_if_necessary[`MERGE_IF_NECESSARY`] rather
than `INHERIT`.

[[repository.name.ownerGroup]]repository.<name>.ownerGroup::
+
A name of a link:config-groups.html[group] which exists. Zero, one or many
groups are allowed.  Each on its own line.  Groups which don't exist are ignored.

[[retry]]
=== Section retry

[[retry.maxWait]]retry.maxWait::
+
Maximum time to wait between attempts to retry an operations when one attempt
fails (e.g. on NoteDb updates due to contention, aka lock failure, on the
underlying ref storage). Operations are retried with exponential backoff, plus
some random jitter, until the interval reaches this limit. After that, retries
continue to occur after a fixed timeout (plus jitter), up to
link:#retry.timeout[`retry.timeout`].
+
Defaults to 5 seconds; unit suffixes are supported, and assumes milliseconds if
not specified.

[[retry.timeout]]retry.timeout::
+
Total timeout for retrying operations when one attempt fails.
+
It is possible to overwrite this default timeout based on operation types by
setting link:#retry.operationType.timeout[`retry.<operationType>.timeout`].
+
Defaults to 20 seconds; unit suffixes are supported, and assumes milliseconds if
not specified.

[[retry.operationType.timeout]]retry.<operationType>.timeout::
+
Total timeout for retrying operations of type `<operationType>` when one
attempt fails. `<operationType>` can be `ACCOUNT_UPDATE`, `CHANGE_UPDATE`,
`GROUP_UPDATE` and `INDEX_QUERY`.
+
Defaults to link:#retry.timeout[`retry.timeout`]; unit suffixes are supported,
and assumes milliseconds if not specified.

[[retry.retryWithTraceOnFailure]]retry.retryWithTraceOnFailure::
+
Whether Gerrit should automatically retry operations on failure with tracing
enabled. The automatically generated traces can help with debugging.
+
By default this is set to false.

[[rules]]
=== Section rules

[[rules.enable]]rules.enable::
+
If true, Gerrit will load and execute 'rules.pl' files in each
project's refs/meta/config branch, if present. When set to false,
only the default internal rules will be used.
+
Default is true, to execute project specific rules.

[[rules.reductionLimit]]rules.reductionLimit::
+
Maximum number of Prolog reductions that can be performed when
evaluating rules for a single change. Each function call made
in user rule code, internal Gerrit Prolog code, or the Prolog
interpreter counts against this limit.
+
Sites using very complex rules that need many reductions should
compile Prolog to Java bytecode with link:pgm-rulec.html[rulec].
This eliminates the dynamic Prolog interpreter from charging its
own reductions against the limit, enabling more logic to execute
within the same bounds.
+
A reductionLimit of 0 is nearly infinite, implemented by setting
the internal limit to 2^31-1.
+
Default is 100,000 reductions (about 14 ms on Intel Core i7 CPU).

[[rules.compileReductionLimit]]rules.compileReductionLimit::
+
Maximum number of Prolog reductions that can be performed when
compiling source code to internal Prolog machine code.
+
Default is 10x reductionLimit (1,000,000).

[[rules.maxSourceBytes]]rules.maxSourceBytes::
+
Maximum input size (in bytes) of a Prolog rules.pl file.  Larger
source files may need a larger rules.compileReductionLimit.  Consider
using link:pgm-rulec.html[rulec] to precompile larger rule files.
+
A size of 0 bytes disables rules, same as rules.enable = false.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
+
Default is 128 KiB.

[[rules.maxPrologDatabaseSize]]rules.maxPrologDatabaseSize::
+
Number of predicate clauses allowed to be defined in the Prolog
database by project rules.  Very complex rules may need more than the
default 256 limit, but cost more memory and may need more time to
evaluate.  Consider using link:pgm-rulec.html[rulec] to precompile
larger rule files.
+
Default is 256.

[[execution]]
=== Section execution

[[execution.defaultThreadPoolSize]]execution.defaultThreadPoolSize::
+
The default size of the background execution thread pool in
which miscellaneous tasks are handled.
+
Default and minimum is 2 so that a single, potentially longer executing
task (e.g. GC), is not blocking the entire execution.

[[execution.fanOutThreadPoolSize]]execution.fanOutThreadPoolSize::
+
Maximum size of thread pool to on which a serving thread can fan-out
work to parallelize it.
+
When set to 0, a direct executor will be used.
+
By default, 25 which means that formatting happens in the caller thread.

[[receiveemail]]
=== Section receiveemail

[[receiveemail.protocol]]receiveemail.protocol::
+
Specifies the protocol used for receiving emails. Valid options are
'POP3', 'IMAP' and 'NONE'. Note that Gerrit will automatically switch between
POP3 and POP3s as well as IMAP and IMAPS depending on the specified
link:#receiveemail.encryption[encryption].
+
Defaults to 'NONE' which means that receiving emails is disabled.

[[receiveemail.host]]receiveemail.host::
+
The hostname of the mailserver. Example: 'imap.gmail.com'.
+
Defaults to an empty string which means that receiving emails is disabled.

[[receiveemail.port]]receiveemail.port::
+
The port the email server exposes for receiving emails.
+
Defaults to the industry standard for a given protocol and encryption:
POP3: 110; POP3S: 995; IMAP: 143; IMAPS: 993.

[[receiveemail.username]]receiveemail.username::
+
Username used for authenticating with the email server.
+
Defaults to an empty string.

[[receiveemail.password]]receiveemail.password::
+
Password used for authenticating with the email server.
+
Defaults to an empty string.

[[receiveemail.encryption]]receiveemail.encryption::
+
Encryption standard used for transport layer security between Gerrit and the
email server. Possible values include 'NONE', 'SSL' and 'TLS'.
+
Defaults to 'NONE'.

[[receiveemail.fetchInterval]]receiveemail.fetchInterval::
+
Time between two consecutive fetches from the email server. Communication with
the email server is not kept alive. Examples: 60s, 10m, 1h.
+
Defaults to 60 seconds.

[[receiveemail.enableImapIdle]]receiveemail.enableImapIdle::
+
If the IMAP protocol is used for retrieving emails, IMAPv4 IDLE can be used to
keep the connection with the email server alive and receive a push when a new
email is delivered to the inbox. In this case, Gerrit will process the email
immediately and will not have a fetch delay.
+
Defaults to false.

[[receiveemail.filter.mode]]receiveemail.filter.mode::
+
An allow and block filter to filter incoming emails.
+
If `OFF`, emails are not filtered by the list filter.
+
If `ALLOW`, only emails where a pattern from
<<receiveemail.filter.patterns,receiveemail.filter.patterns>>
matches 'From' will be processed.
+
If `BLOCK`, only emails where no pattern from
<<receiveemail.filter.patterns,receiveemail.filter.patterns>>
matches 'From' will be processed.
+
Defaults to `OFF`.
+
The previous filter-names 'BLACKLIST' and 'WHITELIST' have been deprecated
since they may be considered disrespectful and there's no technical or
practical reason to use these exact terms for the filters.
For backwards compatibility they are still supported but support for these
deprecated terms will be removed in future releases.

[[receiveemail.filter.patterns]]receiveemail.filter.patterns::
+
A list of regular expressions to match the email sender against. This can also
be a list of addresses when regular expression characters are escaped.

[[sendemail]]
=== Section sendemail

[[sendemail.enable]]sendemail.enable::
+
If false Gerrit will not send email messages, for any reason,
and all other properties of section sendemail are ignored.
+
By default, true, allowing notifications to be sent.

[[sendemail.html]]sendemail.html::
+
If false, Gerrit will only send plain-text emails.
If true, Gerrit will send multi-part emails with an HTML and
plain text part.
+
By default, true, allowing HTML in the emails Gerrit sends.

[[sendemail.connectTimeout]]sendemail.connectTimeout::
+
The connection timeout of opening a socket connected to a
remote SMTP server.
+
Values can be specified using standard time unit abbreviations
('ms', 'sec', 'min', etc.).
If no unit is specified, milliseconds is assumed.
+
Default is 0. A timeout of zero is interpreted as an infinite
timeout. The connection will then block until established or
an error occurs.

[[sendemail.threadPoolSize]]sendemail.threadPoolSize::
+
Maximum size of thread pool in which the review comments
notifications are sent out asynchronously.
+
By default, 1.

[[sendemail.from]]sendemail.from::
+
Designates what name and address Gerrit will place in the From
field of any generated email messages.  The supported values are:
+
* `USER`
+
Gerrit will set the From header to use the current user's
Full Name and Preferred Email.  This may cause messages to be
classified as spam if the user's domain has SPF or DKIM enabled
and <<sendemail.smtpServer,sendemail.smtpServer>> is not a trusted
relay for that domain. You can specify
<<sendemail.allowedDomain,sendemail.allowedDomain>> to instruct Gerrit to only
send as USER if USER is from those domains.
+
* `MIXED`
+
Shorthand for `${user} (Code Review) <review@example.com>` where
`review@example.com` is the same as <<user.email,user.email>>.
See below for a description of how the replacement is handled.
+
* `SERVER`
+
Gerrit will set the From header to the same name and address
it records in any commits Gerrit creates.  This is set by
<<user.name,user.name>> and <<user.email,user.email>>, or guessed
from the local operating system.
+
* `Code Review <review@example.com>`
+
If set to a name and email address in brackets, Gerrit will use
this name and email address for any messages, overriding the name
that may have been selected for commits by user.name and user.email.
Optionally, the name portion may contain the placeholder `${user}`,
which is replaced by the Full Name of the current user.

+
By default, MIXED.

[[sendemail.allowedDomain]]sendemail.allowedDomain::
+
Only used when `sendemail.from` is set to `USER`.
List of allowed domains. If user's email matches one of the domains, emails will
be sent as USER, otherwise as MIXED mode. Wildcards may be specified by
including `\*` to match any number of characters, for example `*.example.com`
matches any subdomain of `example.com`.
+
By default, `*`.

[[sendemail.smtpServer]]sendemail.smtpServer::
+
Hostname (or IP address) of a SMTP server that will relay
messages generated by Gerrit to end users.
+
By default, 127.0.0.1 (aka localhost).

[[sendemail.smtpServerPort]]sendemail.smtpServerPort::
+
Port number of the SMTP server in sendemail.smtpserver.
+
By default, 25, or 465 if smtpEncryption is 'ssl'.

[[sendemail.smtpEncryption]]sendemail.smtpEncryption::
+
Specify the encryption to use, either 'ssl' or 'tls'.
+
By default, 'none', indicating no encryption is used.

[[sendemail.sslVerify]]sendemail.sslVerify::
+
If false and sendemail.smtpEncryption is 'ssl' or 'tls', Gerrit
will not verify the server certificate when it connects to send
an email message.
+
By default, true, requiring the certificate to be verified.

[[sendemail.smtpUser]]sendemail.smtpUser::
+
User name to authenticate with, if required for relay.

[[sendemail.smtpPass]]sendemail.smtpPass::
+
Password for the account named by sendemail.smtpUser.

[[sendemail.allowrcpt]]sendemail.allowrcpt::
+
If present, each value adds one entry to the list of allowed email
addresses that Gerrit can send emails to.  If set to a complete
email address, that one address is added to the list of allowed
emails.
If set to a domain name, any address at that domain can receive
email from Gerrit.
+
If allowrcpt is configured, The set of allowed recipients is:
`allowrcpt - denyrcpt`.
+
By default, unset, permitting delivery to any email address.

[[sendemail.denyrcpt]]sendemail.denyrcpt::
+
If present, each value adds one entry to the list of email
addresses that Gerrit can't send emails to.  If set to a complete
email address, that one address is added to the list of blocked
emails.
If set to a domain name, any address at that domain can *not* receive
email from Gerrit.
+
By default, unset, permitting delivery to any email address.

[[sendemail.includeDiff]]sendemail.includeDiff::
+
If true, new change emails and merged change emails from Gerrit
will include the complete unified diff of the change.
Variable maxmimumDiffSize places an upper limit on how large the
email can get when this option is enabled.
+
By default, false.

[[sendemail.maximumDiffSize]]sendemail.maximumDiffSize::
+
Largest size of unified diff output to include in an email. When
the diff exceeds this size the file paths will be listed instead.
Standard byte unit suffixes are supported.
+
By default, 256 KiB.

[[sendemail.importance]]sendemail.importance::
+
If present, emails sent from Gerrit will have the given level
of importance. Valid values include 'high' and 'low', which
email clients will render in different ways.
+
By default, unset, so no Importance header is generated.

[[sendemail.expiryDays]]sendemail.expiryDays::
+
If present, emails sent from Gerrit will expire after the given
number of days. This will add the Expiry-Date header and
email clients may expire or expunge mails whose Expiry-Date
header is in the past. This should be a positive non-zero
number indicating how many days in the future the mails
should expire.
+
By default, unset, so no Expiry-Date header is generated.

[[sendemail.replyToAddress]]sendemail.replyToAddress::
+
A custom Reply-To address should only be provided if Gerrit is set up to
receive emails and the inbound address differs from
<<sendemail.from,sendemail.from>>.
It will be set as Reply-To header on all types of outgoing email where
Gerrit can parse back a user's reply.
+
Defaults to an empty string which adds <<sendemail.from,sendemail.from>> as
Reply-To if inbound email is enabled and the review's author otherwise.

[[sendemail.allowTLD]]sendemail.allowTLD::
+
List of custom TLDs to allow sending emails to in addition to those specified
in the link:http://data.iana.org/TLD/[IANA list,role=external,window=_blank].
+
Defaults to an empty list, meaning no additional TLDs are allowed.


[[sendemail.addInstanceNameInSubject]]sendemail.addInstanceNameInSubject::
+
When set to true, Gerrit will add its short name to the email subject, allowing recipients to quickly identify
what Gerrit instance the email came from.
+
The short name can be customized via the gerrit.instanceName option.
+
Defaults to false.


[[site]]
=== Section site

[[site.allowOriginRegex]]site.allowOriginRegex::
+
List of regular expressions matching origins that should be permitted
to use the full Gerrit REST API.  These should be trusted applications,
as the sites may be able to use the user's credentials. Applies to
all requests, including state changing methods (PUT, DELETE, POST).
+
Expressions should not require trailing slash. For example a valid
pattern might be `https://build-status[.]example[.]com`.
+
By default, unset, denying all cross-origin requests.

[[site.refreshHeaderFooter]]site.refreshHeaderFooter::
+
If true the server checks the site header, footer and CSS files for
updated versions. If false, a server restart is required to change
any of these resources. Default is true, allowing automatic reloads.

[[ssh-alias]]
=== Section ssh-alias

Variables in section ssh-alias permit the site administrator to alias
another command from Gerrit or a plugin into the `gerrit` command
namespace. To alias `replication start` to `gerrit replicate`:

----
[ssh-alias]
  replicate = replication start
----

[[sshd]]
=== Section sshd

[[sshd.enableCompression]]sshd.enableCompression::
+
In the general case, we want to disable transparent compression, since
the majority of our data transfer is highly compressed Git pack files
and we cannot make them any smaller than they already are.
+
However, if there are CPU in abundance and the server is reachable
through slow networks, gits with huge amount of refs can benefit from
SSH-compression since git does not compress the ref announcement during
handshake.
+
Compression can be especially useful when Gerrit replicas are being used
for the larger clones and fetches and the primary server mostly takes
small receive-packs.
+
By default, `false`.

[[sshd.backend]]sshd.backend::
+
Starting from version 0.9.0 Apache SSHD project added support for NIO2
IoSession. To use the old MINA session the `backend` option must be set
to `MINA`.
+
By default, `NIO2`.

[[sshd.listenAddress]]sshd.listenAddress::
+
Specifies the local addresses the internal SSHD should listen
for connections on.  The following forms may be used to specify
an address.  In any form, `:'port'` may be omitted to use the
default of `29418`.
+
* `'hostname':'port'` (for example `review.example.com:29418`)
* `'IPv4':'port'` (for example `10.0.0.1:29418`)
* `['IPv6']:'port'` (for example `[ff02::1]:29418`)
* `+*:'port'+` (for example `+*:29418+`)

+
--
If multiple values are supplied, the daemon will listen on all
of them.

To disable the internal SSHD, set listenAddress to `off`.

By default, `*:29418`.
--

[[sshd.advertisedAddress]]sshd.advertisedAddress::
+
Specifies the addresses clients should be told to connect to.
This may differ from sshd.listenAddress if a firewall based port
redirector is being used, making Gerrit appear to answer on port
22. The following forms may be used to specify an address.  In any
form, `:'port'` may be omitted to use the default SSH port of 22.

* `'hostname':'port'` (for example `review.example.com:22`)
* `'IPv4':'port'` (for example `10.0.0.1:29418`)
* `['IPv6']:'port'` (for example `[ff02::1]:29418`)

+
--
If multiple values are supplied, the daemon will advertise all
of them.

By default uses the value of `sshd.listenAddress`.
--

[[sshd.tcpKeepAlive]]sshd.tcpKeepAlive::
+
If true, enables TCP keepalive messages to the other side, so
the daemon can terminate connections if the peer disappears.
+
Only effective when `sshd.backend` is set to `MINA`.
+
By default, `true`.

[[sshd.threads]]sshd.threads::
+
Number of threads to use when executing SSH command requests.
If additional requests are received while all threads are busy they
are queued and serviced in a first-come-first-served order.
+
By default, 2x the number of CPUs available to the JVM (but at least 4
threads).
+
[NOTE]
When SSH daemon is enabled then this setting also defines the max number of
concurrent Git requests for interactive users over SSH and HTTP together.

[[sshd.batchThreads]]sshd.batchThreads::
+
Number of threads to allocate for SSH command requests from
link:access-control.html#service_users[service users].
If equals to 0, then all non-interactive requests are executed in the same
queue as interactive requests.
+
Any other value will remove the number of threads from the queue
allocated to interactive users, and create a separate thread pool
of the requested size, which will be used to run commands from
service users.
+
If the number of threads requested for service users is larger
than the total number of threads allocated in sshd.threads, then the
value of sshd.threads is increased to accommodate the requested value.
+
By default is 1 on single core node, 2 otherwise.
+
[NOTE]
When SSH daemon is enabled then this setting also defines the max number of
concurrent Git requests for batch users over SSH and HTTP together.

[[sshd.streamThreads]]sshd.streamThreads::
+
Number of threads to use when formatting events to asynchronous
streaming clients.  Event formatting is multiplexed onto this thread
pool by a simple FIFO scheduling system.
+
By default, 1 plus the number of CPUs available to the JVM.

[[sshd.commandStartThreads]]sshd.commandStartThreads::
+
Number of threads used to parse a command line submitted by a client
over SSH for execution, create the internal data structures used by
that command, and schedule it for execution on another thread.
+
By default, 2.

[[sshd.maxAuthTries]]sshd.maxAuthTries::
+
Maximum number of authentication attempts before the server
disconnects the client.  Each public key that a client has loaded
into its local agent counts as one auth request.  Users can work
around the server's limit by loading less keys into their agent,
or selecting a specific key in their `~/.ssh/config` file with
the `IdentityFile` option.
+
By default, 6.

[[sshd.loginGraceTime]]sshd.loginGraceTime::
+
Time in seconds that a client has to authenticate before the server
automatically terminates their connection.  Values should use common
unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days

+
By default, 2 minutes.

[[sshd.idleTimeout]]sshd.idleTimeout::
+
Time in seconds after which the server automatically terminates idle
connections (or 0 to disable closing of idle connections) not waiting for
any server operation to complete.
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days

+
By default, 0.

[[sshd.waitTimeout]]sshd.waitTimeout::
+
Time in seconds after which the server automatically terminates
connections waiting for a server operation to complete, like for instance
cloning a very large repo with lots of refs.
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
* h, hr, hour, hours
* d, day, days

+
By default, 30s.

[[sshd.gracefulStopTimeout]]sshd.gracefulStopTimeout::
+
Set a graceful stop time. If set, Gerrit ensures that all open SSH
sessions are preserved for a maximum period of time, before forcing the
shutdown of the SSH daemon. During this period, no new requests
will be accepted. This option is meant to be used in setups performing
rolling restarts.
+
Values should use common unit suffixes to express their setting:
+
* s, sec, second, seconds
* m, min, minute, minutes
+
By default, 0 seconds (immediate shutdown).

[[sshd.maxConnectionsPerUser]]sshd.maxConnectionsPerUser::
+
Maximum number of concurrent SSH sessions that a user account
may open at one time.  This is the number of distinct SSH logins
that each user may have active at one time, and is not related to
the number of commands a user may issue over a single connection.
If set to 0, there is no limit.
+
By default, 64.

[[sshd.cipher]]sshd.cipher::
+
Available ciphers.  To permit multiple ciphers, specify multiple
`sshd.cipher` keys in the configuration file, one cipher name
per key.  Cipher names starting with `+` are enabled in addition
to the default ciphers, cipher names starting with `-` are removed
from the default cipher set.
+
Supported ciphers:
+
* `aes128-cbc`
* `aes128-ctr`
* `aes128-gcm@openssh.com`
* `aes192-cbc`
* `aes192-ctr`
* `aes256-cbc`
* `aes256-ctr`
* `aes256-gcm@openssh.com`
* `arcfour128`
* `arcfour256`
* `blowfish-cbc`
* `chacha20-poly1305@openssh.com`
* `3des-cbc`
* `none`
+
If your setup allows for it, it's recommended to disable all ciphers except
the AES-CTR modes.
+
See also link:https://github.com/apache/mina-sshd/tree/master#ciphers[ciphers,role=external,window=_blank].
+
By default, all supported ciphers except `none` are available.

[[sshd.mac]]sshd.mac::
+
Available MAC (message authentication code) algorithms.  To permit
multiple algorithms, specify multiple `sshd.mac` keys in the
configuration file, one MAC per key.  MAC names starting with `+`
are enabled in addition to the default MACs, MAC names starting with
`-` are removed from the default MACs.
+
Supported MACs:
+
* `hmac-md5`
* `hmac-md5-96`
* `hmac-sha1`
* `hmac-sha1-96`
* `hmac-sha2-256`
* `hmac-sha2-512`
* `hmac-sha1-etm@openssh.com`
* `hmac-sha2-256-etm@openssh.com`
* `hmac-sha2-512-etm@openssh.com`
+
See also link:https://github.com/apache/mina-sshd/tree/master#macs[macs,role=external,window=_blank].
+
By default, all supported MACs are available.

[[sshd.enableDeprecatedKexAlgorithms]]sshd.enableDeprecatedKexAlgorithms::
+
Enable deprecated kex algorithms:
+
* `diffie-hellman-group1-sha1`
* `diffie-hellman-group14-sha1`
* `diffie-hellman-group-exchange-sha1`

By default, the deprecated kex algorithms are disabled.

[[sshd.kex]]sshd.kex::
+
--
Available key exchange algorithms. To permit multiple algorithms,
specify multiple `sshd.kex` keys in the configuration file, one key
exchange algorithm per key.  Key exchange algorithm names starting
with `+` are enabled in addition to the default key exchange
algorithms, key exchange algorithm names starting with `-` are
removed from the default key exchange algorithms.

Supported key exchange algorithms:

* `ecdh-sha2-nistp521`
* `ecdh-sha2-nistp384`
* `ecdh-sha2-nistp256`
* `curve25519-sha256`
* `curve25519-sha256@libssh.org`
* `curve448-sha512`
* `diffie-hellman-group-exchange-sha256`
* `diffie-hellman-group18-sha512`
* `diffie-hellman-group17-sha512`
* `diffie-hellman-group16-sha512`
* `diffie-hellman-group15-sha512`
* `diffie-hellman-group14-sha256`

See link:#sshd.enableDeprecatedKexAlgorithms[sshd.enableDeprecatedKexAlgorithms]
for deprecated key algorithms and how to enable them.

It is strongly recommended to disable at least `diffie-hellman-group1-sha1`
as it's known to be vulnerable (logjam attack). Additionally, if your setup
allows for it, it is recommended to disable the remaining two `sha1` key
exchange algorithms.

See also link:https://github.com/apache/mina-sshd/tree/master#key-exchange[key exchange,role=external,window=_blank].

By default, all supported key exchange algorithms are available.
--

[[sshd.kerberosKeytab]]sshd.kerberosKeytab::
+
Enable kerberos authentication for SSH connections.  To permit
kerberos authentication, the server must have a host principal
(see `sshd.kerberosPrincipal`) which is acquired from a keytab.
This must be provisioned by the kerberos administrators, and is
typically installed into `/etc/krb5.keytab` on host machines.
+
The keytab must contain at least one `host/` principal, typically
using the host's canonical name. If it does not use the
canonical name, the `sshd.kerberosPrincipal` should be configured
with the correct name.
+
By default, not set and so kerberos authentication is not enabled.

[[sshd.kerberosPrincipal]]sshd.kerberosPrincipal::
+
If kerberos authentication is enabled with `sshd.kerberosKeytab`,
instead use the given principal name instead of the default.
If the principal does not begin with `host/` a warning message is
printed and may prevent successful authentication.
+
This may be useful if the host is behind an IP load balancer or
other SSH forwarding systems, since the principal name is constructed
by the client and must match for kerberos authentication to work.
+
By default, `host/canonical.host.name`

[[sshd.requestLog]]sshd.requestLog::
+
Enable (or disable) the `'$site_path'/logs/sshd_log` request log.
If enabled, a request log file is written out by the SSH daemon.
The sshd log format is documented link:logs.html#_sshd_log[here].
+
`log4j.appender` with the name `sshd_log` can be configured to overwrite
programmatic configuration.
+
By default, `true`.
+
This value supports link:#reloadConfig[configuration reloads].

[[sshd.rekeyBytesLimit]]sshd.rekeyBytesLimit::
+
The SSH daemon will issue a rekeying after a certain amount of data.
This configuration option allows you to tweak that setting.
+
By default, 1073741824 (bytes, 1GB).
+
The `rekeyBytesLimit` cannot be set to lower than 32.

[[sshd.rekeyTimeLimit]]sshd.rekeyTimeLimit::
+
The SSH daemon will issue a rekeying after a certain amount of time.
This configuration option allows you to tweak that setting.
+
By default, 1h.
+
Set to 0 to disable this check.

[[suggest]]
=== Section suggest

[[suggest.maxSuggestedReviewers]]suggest.maxSuggestedReviewers::
+
The maximum numbers of reviewers suggested.
+
By default 10.
+
This value supports link:#reloadConfig[configuration reloads].

[[suggest.from]]suggest.from::
+
The number of characters that a user must have typed before suggestions
are provided. If set to 0, suggestions are always provided. This is only
used for suggesting accounts when adding members to a group.
+
By default 0.

[[suggest.relevantChanges]]suggest.relevantChanges::
+
When suggesting reviewers, we go over recent changes of the user, and
give priority to users that are present as reviewers in any of those
changes. The number of changes we go over is `sugggest.relevantChanges`.
+
This nubmer is a tradeoff between speed and accuracy.
A high number would be accurate but slow, and a low number would be
fast but inaccurate.
+
By default 50.

[[suggest.skipServiceUsers]]suggest.skipServiceUsers::
+
If link:access-control.html#service_users[service users] should be skipped when
suggesting reviewers.
+
By default true.

[[tracing]]
=== Section tracing

[[tracing.performanceLogging]]tracing.performanceLogging::
+
Whether performance logging is enabled.
+
When performance logging is enabled, performance events for some
operations are collected in memory while a request is running. At the
end of the request the performance events are handed over to the
link:dev-plugins.html#performance-logger[PerformanceLogger] plugins.
This means if performance logging is enabled, the memory footprint of
requests can be markedly increased.
In one recorded case the impact was an overall heap increase of 40%
(using the metrics-reporter-graphite plugin), in other instances the
heap increase wasn't nearly as dramatic and the impact is most likely
dependent on which plugin is used.
+
By default, false.

[[tracing.exportPerformanceMetrics]]tracing.exportPerformanceMetrics::
+
Whether to export performance metrics.
+
Performace logged when link:#tracing.performanceLogging[`performanceLogging`] is
enabled, can be exported as metrics.
+
NOTE: Since the payload returned could be of tens of thousands metrics,
assess the latency of the metrics endpoint before enabling this option.
+
By default, false.

[[tracing.traceid]]
==== Subsection tracing.<trace-id>

There can be multiple `tracing.<trace-id>` subsections to configure
automatic tracing of requests. To be traced a request must match all
conditions of one `tracing.<trace-id>` subsection. The subsection name
is used as trace ID. Using this trace ID administrators can find
matching log entries.

[[tracing.traceid.requestType]]tracing.<trace-id>.requestType::
+
Type of request for which request tracing should be always enabled (can
be `GIT_RECEIVE`, `GIT_UPLOAD`, `REST` and `SSH`).
+
May be specified multiple times.
+
By default, unset (all request types are matched).

[[tracing.traceid.requestUriPattern]]tracing.<trace-id>.requestUriPattern::
+
Regular expression to match request URIs for which request tracing
should be enabled except if they match
link:tracing.traceid.excludedRequestUriPattern[excludedRequestUriPattern].
Request URIs are only available for REST requests. Request URIs never include
the '/a' prefix.
+
May be specified multiple times.
+
By default, unset (all request URIs are matched).

[[tracing.traceid.excludedRequestUriPattern]]tracing.<trace-id>.excludedRequestUriPattern::
+
Regular expression to match request URIs for which request tracing
should not be enabled even if they match
link:#tracing.traceid.requestUriPattern[requestUriPattern].
Request URIs are only available for REST requests. Request URIs never include
the '/a' prefix.
+
May be specified multiple times.
+
By default, unset (no request URIs are excluded).

[[tracing.traceid.account]]tracing.<trace-id>.account::
+
Account ID of an account for which request tracing should be always
enabled.
+
May be specified multiple times.
+
By default, unset (all accounts are matched).

[[tracing.traceid.projectPattern]]tracing.<trace-id>.projectPattern::
+
Regular expression to match project names for which request tracing
should be always enabled.
+
May be specified multiple times.
+
By default, unset (all projects are matched).

[[deadline.id]]
==== Subsection deadline.<id>

There can be multiple `deadline.<id>` subsections to configure deadlines for
request executions. For a deadline to apply all conditions of the
`deadline.<id>` subsection must match. The subsection name is the ID of the
deadline configuration and allows to track back an applied deadline to its
configuration.

Clients can override the deadlines that are configured here by setting a
deadline on the request.

Deadlines are only supported for `REST`, `SSH` and `GIT_RECEIVE` requests, but
not for `GIT_UPLOAD` requests.

[[deadline.id.timeout]]deadline.<id>.timeout::
+
Timeout after which matching requests should be cancelled.
+
Values must be specified using standard time unit abbreviations ('ms', 'sec',
'min', etc.).
+
For some requests additional timeout configurations may apply, e.g.
link:#receive.timeout[receive.timeout] for git pushes.
+
By default, unset.

[[deadline.id.isAdvisory]]deadline.<id>.isAdvisory::
+
Whether this deadline is an advisory deadline. Advisory deadlines do not cause
requests to be aborted when they are exceeded. Instead, if an advisory deadline
is exceeded, only the `cancellation/advisory_deadline_count` metrics is
incremented and a log is written. This is useful to test how many requests would
be affected by a new deadline configuration.
+
By default, `false`.

[[deadline.id.requestType]]deadline.<id>.requestType::
+
Type of request to which the deadline applies (can be `GIT_RECEIVE`, `REST` and
`SSH`).
+
May be specified multiple times.
+
By default, unset (all request types are matched).

[[deadline.id.requestUriPattern]]deadline.<id>.requestUriPattern::
+
Regular expression to match request URIs to which the deadline applies except if
they match
link:#deadline.id.excludedRequestUriPattern[excludedRequestUriPattern]. Request
URIs are only available for REST requests. Request URIs never include the '/a'
prefix.
+
May be specified multiple times.
+
By default, unset (all request URIs are matched).

[[deadline.id.excludedRequestUriPattern]]deadline.<id>.excludedRequestUriPattern::
+
Regular expression to match request URIs to which the deadline should not be
applied even if they match
link:#deadline.id.requestUriPattern[requestUriPattern]. Request URIs are only
available for REST requests. Request URIs never include the '/a' prefix.
+
May be specified multiple times.
+
By default, unset (no request URIs are excluded).

[[deadline.id.account]]deadline.<id>.account::
+
Account ID of an account to which the deadline applies.
+
May be specified multiple times.
+
By default, unset (all accounts are matched).

[[deadline.id.projectPattern]]deadline.<id>.projectPattern::
+
Regular expression to match project names to which the deadline applies.
+
May be specified multiple times.
+
By default, unset (all projects are matched).

[[trackingid]]
=== Section trackingid

Tagged footer lines containing references to external
tracking systems, parsed out of the commit message and
saved in Gerrit's secondary index.

After making changes to this section, existing changes
must be reindexed with link:pgm-reindex.html[reindex].

The tracking ids are searchable using tr:<tracking id> or
bug:<tracking id>.

----
[trackingid "jira-bug"]
  footer = Bugfix:
  footer = Bug:
  match = JRA\\d{2,8}
  system = JIRA

[trackingid "jira-feature"]
  footer = Feature
  match = JRA(\\d{2,8})
  system = JIRA
----

[[trackingid.name.footer]]trackingid.<name>.footer::
+
A prefix tag that identifies the footer line to parse for tracking ids.
+
Several trackingid entries can have the same footer tag, and a single trackingid
entry can have multiple footer tags.
+
If multiple footer tags are specified, each tag will be parsed separately and
duplicates will be ignored.
+
The trailing ":" is optional.

[[trackingid.name.match]]trackingid.<name>.match::
+
A link:http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html[standard
Java regular expression (java.util.regex),role=external,window=_blank] used to match the
external tracking id part of the footer line. The match can
result in several entries in the DB.  If grouping is used in the
regex the first group will be interpreted as the tracking id.
Tracking ids longer than 32 characters will be ignored.
+
The configuration file parser eats one level of backslashes, so the
character class `\s` requires `\\s` in the configuration file.  The
parser also terminates the line at the first `#`, so a match
expression containing # must be wrapped in double quotes.

[[trackingid.name.system]]trackingid.<name>.system::
+
The name of the external tracking system (maximum 20 characters).
It is possible to have several trackingid entries for the same
tracking system.

[[transfer]]
=== Section transfer

[[transfer.timeout]]transfer.timeout::
+
Number of seconds to wait for a single network read or write
to complete before giving up and declaring the remote side is
not responding.  If 0, there is no timeout, and this server will
wait indefinitely for a transfer to finish.
+
A timeout should be large enough to mostly transfer the objects to
the other side.  1 second may be too small for larger projects,
especially over a WAN link, while 10-30 seconds is a much more
reasonable timeout value.
+
Defaults to 0 seconds, wait indefinitely.


[[upload]]
=== Section upload

Options to control the behavior of `upload-pack` on the server side,
which handles a user's fetch, clone, or repo sync command.

----
[upload]
  allowGroup = GROUP_ALLOWED_TO_EXECUTE
  allowGroup = YET_ANOTHER_GROUP_ALLOWED_TO_EXECUTE
----

[[upload.allowGroup]]upload.allowGroup::
+
Name of the groups of users that are allowed to execute 'upload-pack'.
One or more groups can be set.
+
If no groups are added, any user will be allowed to execute
'upload-pack' on the server.

[[accountDeactivation]]
=== Section accountDeactivation

Configures the parameters for the scheduled task to sweep and deactivate Gerrit
accounts according to their status reported by the auth backend. Currently only
supported for LDAP backends.

[[accountDeactivation.startTime]]accountDeactivation.startTime::
+
The link:#schedule-configuration-startTime[start time] for running
account deactivations.

[[accountDeactivation.interval]]accountDeactivation.interval::
+
The link:#schedule-configuration-interval[interval] for running
account deactivations.

Note that the task will only be scheduled if the
link:#autoUpdateAccountActiveStatus[auth.autoUpdateAccountActiveStatus]
is set to true.

link:#schedule-configuration-examples[Schedule examples] can be found
in the link:#schedule-configuration[Schedule Configuration] section.

[[submodule]]
=== Section submodule

[[submodule.verbosesuperprojectupdate]]submodule.verboseSuperprojectUpdate::
+
When using link:user-submodules.html#automatic_update[automatic superproject updates]
this option will determine how the submodule commit messages are included into
the commit message of the superproject update.
+
If `FALSE`, will not include any commit messages for the gitlink update.
+
If `SUBJECT_ONLY`, will include only the commit subjects.
+
If `TRUE`, will include full commit messages.
+
By default this is `TRUE`.

[[submodule.enableSuperProjectSubscriptions]]submodule.enableSuperProjectSubscriptions::
+
This allows to enable the superproject subscription mechanism.
+
By default this is true.

[[submodule.maxCombinedCommitMessageSize]]submodule.maxCombinedCommitMessageSize::
+
This allows to limit the length of the commit message for a submodule.
+
By default this is 262144 (256 KiB).
+
Common unit suffixes of k, m, or g are supported.

[[submodule.maxCommitMessages]]submodule.maxCommitMessages::
+
This allows to limit the number of commit messages that should be combined when creating
a commit message for a submodule.
+
By default this is 1000.

[[user]]
=== Section user

[[user.name]]user.name::
+
Name that Gerrit calls itself in Git when it creates a new Git
commit, such as a merge during change submission.
+
By default this is "Gerrit Code Review".

[[user.email]]user.email::
+
Email address that Gerrit refers to itself as when it creates a
new Git commit, such as a merge commit during change submission.
+
If not set, Gerrit generates this as "gerrit@``hostname``", where
`hostname` is the hostname of the system Gerrit is running on.
+
By default, not set, generating the value at startup.

[[user.anonymousCoward]]user.anonymousCoward::
+
Username that is displayed in the Gerrit Web UI and in e-mail
notifications if the full name of the user is not set.
+
By default "Name of user not set" is used.

[[schedule-configuration]]
=== Schedule Configuration

Schedule configurations are used for running periodic background jobs.

A schedule configuration consists of two parameters:

[[schedule-configuration-interval]]
* `interval`:
Interval for running the periodic background job. The interval must be
larger than zero. The following suffixes are supported to define the
time unit for the interval:
** `s`, `sec`, `second`, `seconds`
** `m`, `min`, `minute`, `minutes`
** `h`, `hr`, `hour`, `hours`
** `d`, `day`, `days`
** `w`, `week`, `weeks` (`1 week` is treated as `7 days`)
** `mon`, `month`, `months` (`1 month` is treated as `30 days`)
** `y`, `year`, `years` (`1 year` is treated as `365 days`)

[[schedule-configuration-startTime]]
* `startTime`:
The start time defines the first execution of the periodic background
job. If the configured `interval` is shorter than `startTime - now` the
start time will be preponed by the maximum integral multiple of
`interval` so that the start time is still in the future. `startTime`
must have one of the following formats:

** `<day of week> <hours>:<minutes>`
** `<hours>:<minutes>`

+
The placeholders can have the following values:

*** `<day of week>`:
`Mon`, `Tue`, `Wed`, `Thu`, `Fri`, `Sat`, `Sun`
*** `<hours>`:
`00`-`23`
*** `<minutes>`:
`00`-`59`

+
The time zone cannot be specified but is always the system default
time zone. Hours must be zero-padded, i.e. `06:00` rather than `6:00`.

The section (and optionally the subsection) in which the `interval` and
`startTime` keys must be set depends on the background job for which a
schedule should be configured. E.g. for the change cleanup job the keys
must be set in the link:#changeCleanup[changeCleanup] section:

----
  [changeCleanup]
    startTime = Fri 10:30
    interval  = 2 days
----

[[schedule-configuration-examples]]
Examples for a schedule configuration:

* Example 1:
+
----
  startTime = Fri 10:30
  interval  = 2 days
----
+
Assuming that the server is started on `Mon 07:00` then
`startTime - now` is `4 days 3:30 hours`. This is larger than the
interval hence the start time is preponed by the maximum integral
multiple of the interval so that start time is still in the future,
i.e. preponed by 4 days. This yields a start time of `Mon 10:30`, next
executions are `Wed 10:30`, `Fri 10:30`. etc.

* Example 2:
+
----
  startTime = 06:00
  interval = 1 day
----
+
Assuming that the server is started on `Mon 07:00` then this yields the
first run on Tuesday at 06:00 and a repetition interval of 1 day.

[[All-Projects-project.config]]
== File `etc/All-Projects/project.config`

The optional file `'$site_path'/etc/All-Projects/project.config` provides
defaults for configuration read from
link:config-project-config.html[`project.config`] in the
`All-Projects` repo. Unlike `gerrit.config`, this file contains project-type
configuration rather than server-type configuration.

Most administrators will not need this file, and should instead make commits to
`All-Projects` to modify global config. However, a separate file can be useful
when managing multiple Gerrit servers, since pushing changes to defaults using
Puppet or a similar tool can be easier than scripting git updates to
`All-Projects`.

The contents of the file are loaded each time the `All-Projects` project is
reloaded. Updating the file requires either evicting the project cache or
restarting the server.

Caveats:

* The path from which the file is read corresponds to the name of the repo,
  which is link:#gerrit.allProjects[configurable].
* Although the file lives in a directory that shares a name with a repository,
  this directory is not a Git repository.
* Only the file `project.config` is read from this directory to provide
  defaults; any other files in this directory, such as `rules.pl`, are ignored.
  (This behavior may change in the future.)
* Group names listed in the access config in this file are resolved to UUIDs
  using the `groups` file in the repository, not in the config directory. As a
  result, setting ACLs in this file is not recommended.

[[secure.config]]
== File `etc/secure.config`

The optional file `'$site_path'/etc/secure.config` overrides (or
supplements) the settings supplied by `'$site_path'/etc/gerrit.config`.
The file should be readable only by the daemon process and can be
used to contain private configuration entries that wouldn't normally
be exposed to everyone.

Sample `etc/secure.config`:
----
[auth]
  registerEmailPrivateKey = 2zHNrXE2bsoylzUqDxZp0H1cqUmjgWb6

[ldap]
  password = l3tm3srch

[httpd]
  sslKeyPassword = g3rr1t

[sendemail]
  smtpPass = sp@m

[remote "bar"]
  password = s3kr3t
----

== File `etc/peer_keys`

The optional file `'$site_path'/etc/peer_keys` controls who can
login as the 'Gerrit Code Review' user, required for the link:cmd-suexec.html[suexec]
command.

The format is one Base-64 encoded public key per line with optional comment, e.g.:
----
# Comments allowed at start of line
AAAAC3...51R== john@example.net
# Another comment
AAAAB5...21S== jane@example.net
----

=== Configurable Parameters

site_path::
+
Local filesystem directory holding the site customization assets.
Placing this directory under version control and/or backup is a
good idea.
+
Files in this directory provide additional configuration.
+
Other files support site customization.
+
* link:config-themes.html[Themes]

[[jgitConfig]]
== File `etc/jgit.config`

Gerrit uses the `$site_path/etc/jgit.config` file instead of the
system-wide and user-global Git configuration for its runtime JGit
configuration.

Sample `etc/jgit.config` file:
----
[core]
  trustFolderStat = false
----

[[jgit-gc]]
=== Section gc

Options in section gc are used when command link:cmd-gc.html[gerrit gc] is used
or scheduled via options link:cmd-gc.html#gc.startTime[gc.startTime] and
link:cmd-gc.html#gc.interval[gc.interval].

[[gc.auto]]gc.auto::
+
When there are approximately more than this many loose objects in the repository,
auto gc will pack them. Some commands use this command to perform a light-weight
garbage collection from time to time. The default value is 6700.
+
Setting this to 0 disables not only automatic packing based on the number of
loose objects, but any other heuristic auto gc will otherwise use to determine
if there’s work to do, such as link:#gc.autoPackLimit[gc.autoPackLimit].

[[gc.autodetach]]gc.autodetach::
+
Makes auto gc run in a background thread. Default is `true`.

[[gc.autopacklimit]]gc.autopacklimit::
+
When there are more than this many packs that are not marked with `*.keep` file
in the repository, auto gc consolidates them into one larger pack. The
default value is 50. Setting this to 0 disables it. Setting `gc.auto` to 0 will
also disable this.

[[gc.packRefs]]gc.packRefs::
+
This variable determines whether gc runs git pack-refs. The default is `true`.

[[gc.reflogExpire]]gc.reflogExpire::
+
Removes reflog entries older than this time; defaults to 90 days. The value "now"
expires all entries immediately, and "never" suppresses expiration altogether.

[[gc.reflogExpireUnreachable]]gc.reflogExpireUnreachable::
+
Removes reflog entries older than this time and not reachable from the
current tip; defaults to 30 days. The value "now" expires all entries immediately,
and "never" suppresses expiration altogether.

[[jgit-protocol]]
=== Section protocol

[[protocol.version]]protocol.version::
+
If set, the server will accept requests from a client attempting to communicate
using the specified protocol version. Default is `2`. If set in file
`etc/jgit.config` this option will be used for all repositories of the site.
It can be overridden for a given repository by configuring a different value in
the repository's `config` file.
+
Supported versions:
0:: the original wire protocol.
1:: the original wire protocol with the addition of a version string in the initial response from the server.
2:: wire protocol version 2. Speeds up fetches from repositories with many refs by allowing the client
    to specify which refs to list before the server lists them.

[[jgit-receive]]
=== Section receive

[[receive.autogc]]receive.autogc::
+
By default, up to Gerrit 3.2 `git-receive-pack` will run auto gc after receiving data from git-push and updating refs.
You can stop it by setting this variable to `false`. This is recommended in gerrit to avoid the
additional load this creates. Instead schedule gc using link:cmd-gc.html#gc.startTime[gc.startTime]
and link:cmd-gc.html#gc.interval[gc.interval] or e.g. in a cron job that runs gc in a separate process.
Since Gerrit 3.3 the init command will auto-configure `git-receive-pack = false` in `etc/jgit.config` if
it wasn't set manually and show a warning if it was set to `true` manually.

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
