| Gerrit Code Review - Git Replication | 
 | ==================================== | 
 |  | 
 | Gerrit can automatically push any changes it makes to its managed Git | 
 | repositories to another system.  Usually this would be configured to | 
 | provide mirroring of changes, for warm-standby backups, or a | 
 | load-balanced public mirror farm. | 
 |  | 
 | The replication runs on a short delay.  This gives Gerrit a small | 
 | time window to batch updates going to the same project, such as | 
 | when a user uploads multiple changes at once. | 
 |  | 
 | Typically replication should be done over SSH, with a passwordless | 
 | public/private key pair.  On a trusted network it is also possible to | 
 | use replication over the insecure (but much faster) git:// protocol, | 
 | by enabling the `receive-pack` service on the receiving system, but | 
 | this configuration is not recommended. | 
 |  | 
 | Enabling Replication | 
 | -------------------- | 
 |  | 
 | If replicating over SSH (recommended), 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 | 
 | ==== | 
 |  | 
 | Next, create `'$site_path'/replication.config` as a Git-style config | 
 | file, and restart Gerrit. | 
 |  | 
 | Example `replication.config` to replicate in parallel to four | 
 | different hosts: | 
 |  | 
 | ==== | 
 |   [remote "host-one"] | 
 |     url = gerrit2@host-one.example.com:/some/path/${name}.git | 
 |  | 
 |   [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 | 
 |     push = +refs/heads/* | 
 |     push = +refs/tags/* | 
 |     threads = 3 | 
 |     authGroup = Public Mirror Group | 
 |     authGroup = Second Public Mirror Group | 
 | ==== | 
 |  | 
 | To manually trigger replication at runtime, see | 
 | link:cmd-replicate.html[gerrit replicate]. | 
 |  | 
 | [[replication_config]]File `replication.config` | 
 | ----------------------------------------------- | 
 |  | 
 | The optional file `'$site_path'/replication.config` is a Git-style | 
 | config file that controls the replication settings for Gerrit. | 
 |  | 
 | The file is composed of one or more `remote` sections, each remote | 
 | section provides common configuration settings for one or more | 
 | destination URLs. | 
 |  | 
 | Each remote section uses its own thread pool.  If pushing to | 
 | 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. | 
 |  | 
 | [[remote]]Section remote | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | In the keys below, the <name> portion is unused by Gerrit, but must be | 
 | unique to distinguish the different sections if more than one remote | 
 | section appears in the file. | 
 |  | 
 | [[remote.name.url]]remote.<name>.url:: | 
 | + | 
 | Address of the remote server to push to.  Multiple URLs may | 
 | be specified within a single remote block, listing different | 
 | destinations which share the same settings.  Assuming sufficient | 
 | threads in the thread pool, Gerrit pushes to all URLs in parallel, | 
 | using one thread per URL. | 
 | + | 
 | 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. | 
 | + | 
 | See link:http://www.kernel.org/pub/software/scm/git/docs/git-push.html#URLS[GIT URLS] | 
 | for details on Git URL syntax. | 
 |  | 
 | [[remote.name.receivepack]]remote.<name>.receivepack:: | 
 | + | 
 | Path of the `git-receive-pack` executable on the remote system, if | 
 | using the SSH transport. | 
 | + | 
 | Defaults to `git-receive-pack`. | 
 |  | 
 | [[remote.name.uploadpack]]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.push]]remote.<name>.push:: | 
 | + | 
 | 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 push keys can be supplied, to specify multiple patterns | 
 | to match against.  In the example file above, remote "pubmirror" | 
 | uses two push keys to match both `refs/heads/\*` and `refs/tags/*`, | 
 | but excludes all others, including `refs/changes/*`. | 
 | + | 
 | Defaults to `+refs/\*:refs/*` (all refs) if not specified. | 
 |  | 
 | [[remote.name.timeout]]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 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. | 
 |  | 
 | [[remote.name.replicationDelay]]remote.<name>.replicationDelay:: | 
 | + | 
 | Number of seconds to wait before scheduling a remote push operation. | 
 | Setting the delay to 0 effectively disables the delay, causing the | 
 | push to start as soon as possible. | 
 | + | 
 | This is a Gerrit specific extension to the Git remote block. | 
 | + | 
 | By default, 15 seconds. | 
 |  | 
 | [[remote.name.threads]]remote.<name>.threads:: | 
 | + | 
 | Number of worker threads to dedicate to pushing to the repositories | 
 | described by this remote.  Each thread can push one project at a | 
 | time, to one destination 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 pushing. | 
 | + | 
 | By default, 1 thread. | 
 |  | 
 | [[remote.name.authGroup]]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 to all remotes. | 
 |  | 
 |  | 
 | [[ssh_config]]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 passphases 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. | 
 |  | 
 | GERRIT | 
 | ------ | 
 | Part of link:index.html[Gerrit Code Review] |