@PLUGIN@ Configuration
=========================

Enabling Replication
--------------------

If replicating over SSH, ensure the host key of the
remote system(s) is already in the Gerrit user's `~/.ssh/known_hosts`
file.  The easiest way to add the host key is to connect once by hand
with the command line:

```
  sudo su -c 'ssh mirror1.us.some.org echo' gerrit2
```

<a name="example_file">
Next, create `$site_path/etc/replication.config` as a Git-style config
file, for example to replicate in parallel from four different hosts:</a>

```
  [remote "host-two"]
    url = gerrit2@host-two.example.com:/some/path/${name}.git
    apiUrl = http://host-two.example.com:8080
    fetch = +refs/*:refs/*

  [remote "pubmirror"]
    url = mirror1.us.some.org:/pub/git/${name}.git
    url = mirror2.us.some.org:/pub/git/${name}.git
    url = mirror3.us.some.org:/pub/git/${name}.git
    fetch = +refs/heads/*:refs/heads/*
    fetch = +refs/tags/*:refs/tags/*
    threads = 3
    authGroup = Public Mirror Group
    authGroup = Second Public Mirror Group
```

And make sure that instanceId is setup in `$site_path/etc/gerrit.config`:

```
[gerrit]
    instanceId = host-one
```

Then reload the replication plugin to pick up the new configuration:

```
  ssh -p 29418 localhost gerrit plugin reload @PLUGIN@
```

To manually trigger replication at runtime, see
SSH command [start](cmd-start.md).

File `gerrit.config`
-------------------------

cache.@PLUGIN@-apply_objects.maxAge
:	Maximum age to keep history of the latest successful apply-object 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

	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 60s.

cache.@PLUGIN@-apply_objects.memoryLimit
:	The maximum number of apply-object refs retained in memory.

	Default is 1024.

cache.projects.refreshAfterWrite
:	The Gerrit configuration of the `projects` cache, as [documented](/Documentation/config-gerrit.html#cache.name.refreshAfterWrite)

	Needs to be set to a relatively low value (e.g. 1 min) for allowing the
	project settings cache to be kept relatively up-to-date (e.g. within 1 mins)
	with the incoming replication tasks updating it.

cache.project_list.refreshAfterWrite
:	The Gerrit configuration of the `project_list` cache, as [documented](/Documentation/config-gerrit.html#cache.name.refreshAfterWrite)

	Needs to be set to a relatively low value (e.g. 5 min) for allowing the
	creation, removal and hiding of projects performed by incoming
	replication tasks to be reflected relavitely soon (e.g. within 5 mins)
	in the list of projects.

File `@PLUGIN@.config`
-------------------------

The optional file `$site_path/etc/replication.config` is a Git-style
config file that controls the replication settings for the replication
plugin.

The file is composed of one or more `remote` sections, each remote
section provides common configuration settings for one or more
source URLs.

Each remote section uses its own thread pool.  If fetching from
multiple remotes, over differing types of network connections
(e.g. LAN and also public Internet), its a good idea to put them
into different remote sections, so that replication to the slower
connection does not starve out the faster local one.  The example
file above does this.

In the keys below, the `NAME` portion is unused by this plugin, but
must be unique to distinguish the different sections if more than one
remote section appears in the file.

gerrit.replicateOnStartup
:	If true, replicates from all remotes on startup to ensure they
	are in-sync with this server.  By default, false.

gerrit.autoReload
:	If true, automatically reloads replication sources and settings
	after `replication.config` file is updated, without the need to restart
	the replication plugin. When the reload takes place, pending replication
	events based on old settings are discarded. By default, false.

gerrit.defaultForceUpdate
:	If true, the default fetch refspec will be set to use forced update to
	the local repository when no refspec is given.  By default, false.


replication.applyObjectBannedCreateRefs
:	Specify which refs created should be banned from being
	replicated synchronously via apply-object.

	It can be provided more than once, and supports three formats: regular expressions,
	wildcard matching, and single ref matching. All three formats match are case-sensitive.

	Values starting with a caret `^` are treated as regular
	expressions. For the regular expressions details please follow
	official [java documentation](https://docs.oracle.com/javase/tutorial/essential/regex/).

	Please note that regular expressions could also be used
	with inverse match.

	Values that are not regular expressions and end in `*` are
	treated as wildcard matches. Wildcards match refs whose
	name agrees from the beginning until the trailing `*`. So
	`foo/b*` would match the refs `foo/b`, `foo/bar`, and
	`foo/baz`, but neither `foobar`, nor `bar/foo/baz`.

	Values that are neither regular expressions nor wildcards are
	treated as single ref matches. So `foo/bar` matches only
	the ref `foo/bar`, but no other refs.

	By default, set to empty (all create refs are replicated synchronously).

replication.lockErrorMaxRetries
:	Number of times to retry a replication operation if a lock
	error is detected.

	If two or more replication operations (to the same GIT and Ref)
	are scheduled at approximately the same time (and end up on different
	replication threads), there is a large probability that the last
	fetch to complete will fail with a remote "failure to lock" error.
	This option allows Gerrit to retry the replication fetch when the
	"failure to lock" error is detected.

	A good value would be 3 retries or less, depending on how often
	you see lockError collisions in your server logs. A too highly set
	value risks keeping around the replication operations in the queue
	for a long time, and the number of items in the queue will increase
	with time.

	Normally Gerrit will succeed with the replication during its first
	retry, but in certain edge cases (e.g. a mirror introduces a ref
	namespace with the same name as a branch on the master) the retry
	will never succeed.

	The issue can also be mitigated somewhat by increasing the
	replicationDelay.

	Default: 0 (disabled, i.e. never retry)

replication.maxRetries
:	Maximum number of times to retry a fetch operation that previously
	failed.

	When a fetch operation reaches its maximum number of retries,
	the replication event is discarded from the queue.

	Can be overridden at remote-level by setting replicationMaxRetries.

	By default, fetches are retried indefinitely.

	Note that only transient errors will be retried, whilst persistent errors will
	cause a terminal failure, and the fetch will not be scheduled again. This is
	only supported for JGit, not cGit. Currently, only the following failures are
	considered permanent:

	- UnknownHostKey: thrown by Jsch when establishing an SSH connection for an
	unknown host.
	- cGit / JGit transport exception when the remote ref does not exist. The assumption
	here is that the remote ref does not exist so it is not worth retrying. If the
	exception arisen as a consequence of some ACLs (mis)configuration, then after
	fixing the ACLs, an explicit replication must be manually triggered.

replication.instanceLabel
:	Remote configuration name of the current server.
	This label is passed as a part of the payload to notify other
	servers to fetch specified ref-update object id from the url
	provided in the remote configuration section which name is equal
	to instanceLabel.

	Deprecated: This property is kept for backward compatibility and
	will be removed in the future release. Use [gerrit.instanceId](https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#gerrit.instanceId)
	instead.

replication.consumeStreamEvents
:	Use stream events to trigger pull-replication actions alongside the
	REST approach. This mechanism is useful together with event-broker
	and multi-site to provide backfill mechanism when a node has to
	catch up with the events after being unreachable.

	When `consumeStreamEvents` is enabled gerrit.instanceId
	instead of [replication.instanceLabel](https://gerrit.googlesource.com/plugins/pull-replication/+/refs/heads/stable-3.4/src/main/resources/Documentation/config.md#replication.instanceLabel) must be used.

	Using pull-replication standalone with a broker is also possible.
	Check the replication.eventBrokerTopic parameter.

	Default: false

replication.eventBrokerTopic
:	Topic to consumer stream events from.

	Pull-replication can receive stream events and use it as
	notification mechanism as alternative to REST API notifications.
	It can work in standalone, not necessarily with the multi-site plugin
	(check replication.consumerStreamEvents if you need to use it with
	multi-site). This parameter is used to define the topic to consume
	stream events messages from when using the pull-replication in
	standalone with a broker.

	When `eventBrokerTopic` is enabled gerrit.instanceId
	instead of [replication.instanceLabel](https://gerrit.googlesource.com/plugins/pull-replication/+/refs/heads/stable-3.4/src/main/resources/Documentation/config.md#replication.instanceLabel)
	must be used.

	Bear in mind that if consumeStreamEvents is set to true this
	parameter will be ignored.

	Default: unset

replication.eventBrokerGroupId
:	Optional group id for consumers. Used for keeping the offset of the
	the last acked message on the topic with a specific group id; supported
	only if the event-broker plugin supports the ExtendedBrokerApi
	interface.
	When not set, the messages received are acked using a global group id
	shared by all subscribers in Gerrit.

	Default: unset

replication.maxConnectionsPerRoute
:	Maximum number of HTTP connections per one HTTP route.

	Default: 100

replication.maxConnections
:	Total number of HTTP connections pool.

	Default: 2 * replication.maxConnectionsPerRoute

replication.useCGitClient
:	By default Gerrit uses JGit library to execute all git protocol command.
	By setting this property to true all git fetch operation are going to be
	executed using CGit client instead of JGit.

	Default: false

replication.refsBatchSize
:	Number of refs that are fetched in a single fetch call.
	If number of refs to fetch is greater then this param,
	refs are going to be split into a separate fetch operations.

	Value must be greater than zero.

	Default: 50

replication.excludeRefs
:   Specify which refs should be excluded from git fetch calls. It can be provided
    more than once, and supports three formats: regular expressions, wildcard
    matching, and single ref matching. All three formats match are case-sensitive.

    Values starting with a caret `^` are treated as regular
    expressions. For the regular expressions details please follow
    official [java documentation](https://docs.oracle.com/javase/tutorial/essential/regex/).

    Please note that regular expressions could also be used
    with inverse match.

    Values that are not regular expressions and end in `*` are
    treated as wildcard matches. Wildcards match refs whose
    name agrees from the beginning until the trailing `*`. So
    `foo/b*` would match the refs `foo/b`, `foo/bar`, and
    `foo/baz`, but neither `foobar`, nor `bar/foo/baz`.

    Values that are neither regular expressions nor wildcards are
    treated as single ref matches. So `foo/bar` matches only
    the ref `foo/bar`, but no other refs.

    By default, the following refs are excluded from the git fetch calls:
    - refs/cache-automerge/*
    - refs/starred-changes/*

    Note that if you are using @PLUGIN@ together with multi-site, you should
    explicitly exclude `refs/multi-site/version` from being replicated.

replication.syncRefs
:   Specify for which refs git fetch calls should be executed synchronously.
    It can be provided more than once, and supports three formats: regular expressions,
    wildcard matching, and single ref matching. All three formats match are case-sensitive.

    Values starting with a caret `^` are treated as regular
    expressions. For the regular expressions details please follow
    official [java documentation](https://docs.oracle.com/javase/tutorial/essential/regex/).

    Please note that regular expressions could also be used
    with inverse match.

    Values that are not regular expressions and end in `*` are
    treated as wildcard matches. Wildcards match refs whose
    name agrees from the beginning until the trailing `*`. So
    `foo/b*` would match the refs `foo/b`, `foo/bar`, and
    `foo/baz`, but neither `foobar`, nor `bar/foo/baz`.

    Values that are neither regular expressions nor wildcards are
    treated as single ref matches. So `foo/bar` matches only
    the ref `foo/bar`, but no other refs.

    By default, set to '*' (all refs are replicated synchronously).

replication.fallbackToApplyObjectsRefs
:   Specify for which refs will fallback to apply-objects REST-API that is capable of applying
an entire chain of commits on the ref chain so that the Git fetch can be avoided altogether.
It can be provided more than once, and supports three formats: regular expressions,
wildcard matching, and single ref matching. All three formats matches are case-sensitive.

    Values starting with a caret `^` are treated as regular
    expressions. For the regular expressions details please follow
    official [java documentation](https://docs.oracle.com/javase/tutorial/essential/regex/).

    Please note that regular expressions could also be used
    with inverse match.

    Values that are not regular expressions and end in `*` are
    treated as wildcard matches. Wildcards match refs whose
    name agrees from the beginning until the trailing `*`. So
    `foo/b*` would match the refs `foo/b`, `foo/bar`, and
    `foo/baz`, but neither `foobar`, nor `bar/foo/baz`.

    Values that are neither regular expressions nor wildcards are
    treated as single ref matches. So `foo/bar` matches only
    the ref `foo/bar`, but no other refs.

    By default, set to 'refs/changes/**/meta'.

    Note that the refs/changes/**/meta always fallback to apply-objects REST-API

replication.maxApiPayloadSize
:	Maximum size in bytes of the ref to be sent as a REST Api call
	payload. For refs larger than threshold git fetch operation
	will be used.

	Default: 10000

replication.shutDownDrainTimeout
:   Maximum duration to wait for pending, retrying and executing fetch tasks to
	complete after a request of plugin shutdown. 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: 5 minutes

remote.NAME.url
:	Address of the remote server to fetch from. Single URL can be
	specified within a single remote block. A remote node can request
	a fetch from a source. However, it will need to be sure that the
	source corresponds to only *him* configured as remote. Fetching from
	multiple sources at the same time, whilst it was useful in a push scenario,
	doesn't make so much sense in a pull-replication flow.
	Within each URL value the magic placeholder `${name}` is
	replaced with the Gerrit project name.  This is a Gerrit
	specific extension to the otherwise standard Git URL syntax
	and it must be included in each URL so that Gerrit can figure
	out where each project needs to be replicated. `${name}` may
	only be omitted if the remote refers to a single repository
	(i.e.: Exactly one [remote.NAME.projects][3] and that name's
	value is a single project match.).

	See [git fetch][1] for details on Git URL syntax.

[1]: http://www.git-scm.com/docs/git-fetch#URLS
[3]: #remote.NAME.projects

remote.NAME.apiUrl
:	Address of the rest api endpoint of the remote server to fetch from.
	Multiple URLs may be specified within a single remote block, listing
	different destinations which share the same settings. Gerrit calls
	all URLs in sequence.

remote.NAME.connectionTimeout
:	Defines the socket timeout ({@code SO_TIMEOUT}) in milliseconds,
	which is the timeout for waiting for data or, put differently,
	a maximum period inactivity between two consecutive data packets.

	Default: 5000

remote.NAME.idleTimeout
:	Defines period of inactivity in milliseconds after which persistent connections must
	be re-validated prior to being leased to the consumer. Non-positive value disables 
	connection validation. This check helps detect connections that have become stale
	(half-closed) while kept inactive in the pool.

	Default: 10000

remote.NAME.uploadpack
:	Path of the `git-upload-pack` executable on the remote system,
	if using the SSH transport.

	Defaults to `git-upload-pack`.

remote.NAME.fetch
:	Standard Git refspec denoting what should be replicated.
	Setting this to `+refs/heads/*:refs/heads/*` would mirror only
	the active branches, but not the change refs under
	`refs/changes/`, or the tags under `refs/tags/`.

	Multiple fetch keys can be supplied, to specify multiple
	patterns to match against.  In the [example above][2], remote
	"pubmirror" uses two fetch keys to match both `refs/heads/*`
	and `refs/tags/*`, but excludes all others, including
	`refs/changes/*`.

	Note that the `refs/meta/config` branch is only replicated
	when `replicatePermissions` is true, even if the push refspec
	is 'all refs'.

>  NOTE: **NOT having** a `fetch` configuration for a remote, causes
>  the remote to be ignored.

[2]: #example_file

remote.NAME.timeout
:	Number of seconds to wait for a network read or write to
	complete before giving up and declaring the remote side is not
	responding.  If 0, there is no timeout, and the push client
	waits indefinitely.

	A timeout should be large enough to mostly transfer the
	objects from 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.

remote.NAME.replicationDelay
:	Time to wait before scheduling an asynchronous remote fetch
	operation. Setting the delay to 0 effectively disables the delay,
	causing the fetch to start as soon as possible.

	This is a Gerrit specific extension to the Git remote block.

	By default for asynchronous fetch, 4 seconds. For a synchronous fetch
	replicationDelay is zero.

remote.NAME.rescheduleDelay
:	Delay when rescheduling a fetch operation due to an in-flight fetch
	running for the same project.

	Cannot be set to a value lower than 3 seconds to avoid a tight loop
	of schedule/run which could cause 1K+ retries per second.

	A configured value lower than 3 seconds will be rounded to 3 seconds.

	By default, 3 seconds.

remote.NAME.replicationRetry
:	Time to wait before scheduling a remote fetch operation previously
	failed due to a remote server error.

	If a remote fetch operation fails because a remote server was
	offline, all fetch operations from the same source URL are
	blocked, and the remote fetch is continuously retried unless
	the replicationMaxRetries value is set.

	This is a Gerrit specific extension to the Git remote block.

	By default, 1 minute.

remote.NAME.replicationMaxRetries
:	Maximum number of times to retry a fetch operation that previously
	failed.

	When a fetch operation reaches its maximum number of retries
	the replication event is discarded from the queue.

	This is a Gerrit specific extension to the Git remote block.

	By default, use replication.maxRetries.

	Note that not all fetch failures are retriable. Please refer
	to `replication.maxRetries` for more information on this.

remote.NAME.threads
:	Number of worker threads to dedicate to fetching to the
	repositories described by this remote.  Each thread can fetch
	one project at a time, from one source URL.  Scheduling
	within the thread pool is done on a per-project basis.  If a
	remote block describes 4 URLs, allocating 4 threads in the
	pool will permit some level of parallel fetching.

	By default, 1 thread.

remote.NAME.createMissingRepositories
:	Replicate newly created repositories.

	By default, true.

remote.NAME.replicateProjectDeletions
:	If true, project deletions will also be replicated to the
remote site.

	By default, false, do *not* replicate project deletions.

remote.NAME.replicateHiddenProjects
:	If true, hidden projects will also be replicated to the
remote site.

	By default, false, do *not* replicate hidden projects.

remote.NAME.mirror
:	If true, replication will remove local branches and tags that are
absent remotely or invisible to the replication (for example read access
denied via `authGroup` option).

	By default, false, do not remove remote branches or tags.

remote.NAME.authGroup
:	Specifies the name of a group that the remote should use to
	access the repositories. Multiple authGroups may be specified
	within a single remote block to signify a wider access right.
	In the project administration web interface the read access
	can be specified for this group to control if a project should
	be replicated or not to the remote.

	By default, replicates without group control, i.e. replicates
	everything from all remotes.

remote.NAME.remoteNameStyle
:	Provides possibilities to influence the name of the source
	repository, e.g. by replacing slashes in the `${name}`
	placeholder.

	Github and Gitorious do not permit slashes "/" in repository
	names and will change them to dashes "-" at repository creation
	time.

	If this setting is set to "dash", slashes will be replaced with
	dashes in the remote repository name. If set to "underscore",
	slashes will be replaced with underscores in the repository name.

	Option "basenameOnly" makes `${name}` to be only the basename
	(the part after the last slash) of the repository path on the
	Gerrit server, e.g. `${name}` of `foo/bar/my-repo.git` would
	be `my-repo`.

	By default, "slash", i.e. remote names will contain slashes as
	they do in Gerrit.

<a name="remote.NAME.projects">remote.NAME.projects</a>
:	Specifies which repositories should be replicated from the
	remote. It can be provided more than once, and supports three
	formats: regular expressions, wildcard matching, and single
	project matching. All three formats match case-sensitive.

	Values starting with a caret `^` are treated as regular
	expressions. `^foo/(bar|baz)` would match the projects
	`foo/bar`, and `foo/baz`. Regular expressions have to fully
	match the project name. So the above example would not match
	`foo/bar2`, while `^foo/(bar|baz).*` would.

	Projects may be excluded from replication by using a regular
	expression with inverse match. `^(?:(?!PATTERN).)*$` will
	exclude any project that matches.

	Values that are not regular expressions and end in `*` are
	treated as wildcard matches. Wildcards match projects whose
	name agrees from the beginning until the trailing `*`. So
	`foo/b*` would match the projects `foo/b`, `foo/bar`, and
	`foo/baz`, but neither `foobar`, nor `bar/foo/baz`.

	Values that are neither regular expressions nor wildcards are
	treated as single project matches. So `foo/bar` matches only
	the project `foo/bar`, but no other project.

	By default, replicates without matching, i.e. replicates
	everything from all remotes.

remote.NAME.enableBatchedRefs
:	Keep the synchronous replication actions together as a single call
	with all the refs included in the batch ref update.

>	*NOTE*: if any ref from a single batch matches `replication.syncRefs`
>	filter, all refs in that batch are going to be fetched synchronously as
>	a single git fetch operation.

>	*NOTE*: Should ref deletions over apply-object/HTTP, they will
>	be attempted over fetch/HTTP endpoint only when `enableBatchedRefs` is
>	enabled.
>
>	By default, true.

remote.NAME.fetchEvery
:	Fetch the ref-spec `remote.NAME.fetch` from the remote repository defined
	at `remote.NAME.url` for remote changes every `n` seconds.
	By default set to `0s` which means that polling is disabled. Note that
	larger time units (`m`, `h`, etc...) can be used to specify it conveniently.

	Setting `fetchEvery` to value greater than `0` means that It will,
	periodically, invoke git fetch to detect and retrieve new data from the
	remote.

>	*NOTE:* it is meant for the remote that doesn't offer events or webhooks
>	that could be used otherwise for new data detection and cannot be configured
>	together with `remote.NAME.apiUrl`; such configuration is considered
>	invalid and prevents the plugin from starting

>	*NOTE*: Periodic fetches are scheduled using a dedicated (single
>	threaded) pool, called `PeriodicallyFetchFromSources`. It is created only
>	when there is at least one remote configured to fetch periodically.

>	*NOTE*: Scheduling is performed on plugin start therefore one needs to
>	reload plugin when configuration gets changed.

Directory `replication`
--------------------
The optional directory `$site_path/etc/replication` contains Git-style
config files that controls the replication settings for the pull replication
plugin. When present all `remote` sections from `replication.config` file are
ignored.

Files are composed of one `remote` section. Multiple `remote` sections or any
other section makes the file invalid and skipped by the pull replication plugin.
File name defines remote section name. Each section provides common configuration
settings for one or more destination URLs. For more details how to setup `remote`
sections please refer to the `replication.config` section.

### Configuration example:

Static configuration in `$site_path/etc/replication.config`:

```
[gerrit]
    autoReload = true
    replicateOnStartup = false
[replication]
    lockErrorMaxRetries = 5
    maxRetries = 5
```

Remote sections in `$site_path/etc/replication` directory:

* File `$site_path/etc/replication/host-two.config`

 ```
 [remote]
    url = gerrit2@host-two.example.com:/some/path/${name}.git
    apiUrl = http://host-two
    fetch = +refs/*:refs/*
 ```


* File `$site_path/etc/replication/host-three.config`

 ```
  [remote]
    url = mirror1.host-three:/pub/git/${name}.git
    url = mirror2.host-three:/pub/git/${name}.git
    url = mirror3.host-three:/pub/git/${name}.git
    apiUrl = http://host-three
    fetch = +refs/heads/*:refs/heads/*
    fetch = +refs/tags/*:refs/tags/*
 ```

Pull replication plugin resolves config files to the following configuration:

```
[gerrit]
    autoReload = true
    replicateOnStartup = false
[replication]
    lockErrorMaxRetries = 5
    maxRetries = 5

[remote "host-two"]
    url = gerrit2@host-two.example.com:/some/path/${name}.git
    apiUrl = http://host-two
    fetch = +refs/*:refs/*

[remote "host-three"]
    url = mirror1.host-three:/pub/git/${name}.git
    url = mirror2.host-three:/pub/git/${name}.git
    url = mirror3.host-three:/pub/git/${name}.git
    apiUrl = http://host-three
    fetch = +refs/heads/*:refs/heads/*
    fetch = +refs/tags/*:refs/tags/*
```

File `secure.config`
--------------------

The optional file `$site_path/secure.config` is a Git-style config
file that provides secure values that should not be world-readable,
such as passwords. The HTTP authentication can be configured in 2 
different flavours:

*HTTP Bearer Token Authentication*

auth.bearerToken
:	shared secret configured on all replication endpoints. 

*HTTP Basic Authentication*

remote.NAME.username
:	Username to use for HTTP authentication on this remote, if not
	given in the URL.

remote.NAME.password
:	Password to use for HTTP authentication on this remote.

In both cases, the Global Capability `Access Database` [1] needs to be allowed
in order to permit all `All-Users`' refs to be replicated. When _basic auth_ is
used, the capability must be assigned to the `remote.NAME.username` used in
configuration, whilst for _bearer token_, it needs to be assigned to
the `Pull-replication Internal User` user.

[1] https://gerrit-review.googlesource.com/Documentation/access-control.html#capability_accessDatabase

File `~/.ssh/config`
--------------------

If present, Gerrit reads and caches `~/.ssh/config` at startup, and
supports most SSH configuration options.  For example:

```
  Host host-one.example.com
    IdentityFile ~/.ssh/id_hostone
    PreferredAuthentications publickey

  Host mirror*.us.some.org
    User mirror-updater
    IdentityFile ~/.ssh/id_pubmirror
    PreferredAuthentications publickey
```

Supported options:

  * Host
  * Hostname
  * User
  * Port
  * IdentityFile
  * PreferredAuthentications
  * StrictHostKeyChecking

SSH authentication must be by passwordless public key, as there is no
facility to read passphrases on startup or passwords during the SSH
connection setup, and SSH agents are not supported from Java.

Host keys for any destination SSH servers must appear in the user's
`~/.ssh/known_hosts` file, and must be added in advance, before Gerrit
starts.  If a host key is not listed, Gerrit will be unable to connect
to that destination, and replication to that URL will fail.
