|  | 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] |