| = Gerrit Code Review - Project Configuration |
| |
| Every project has a configuration that defines access rights and controls |
| project-specific behavior. |
| |
| The project configuration is stored inside the git repository inside the |
| `refs/meta/config` branch. |
| |
| [[refs-meta-config]] |
| == The `refs/meta/config` branch |
| |
| The `refs/meta/config` branch contains configuration files. It is disconnected |
| from the normal branches under `refs/heads/` that contain the source code. |
| |
| The files inside the `refs/meta/config` branch are versioned just like any |
| other file in the repository. This means from the git history of the |
| `refs/meta/config` branch it can be seen how the configuration changed |
| over time and which configuration was active when. |
| |
| [[configuration-files]] |
| == Configuration files |
| |
| The project configuration is stored in the following files (these files are |
| stored inside the `refs/meta/config` branch, see |
| link:#refs-meta-config[above]): |
| |
| * link:#file-project_config[project.config]: |
| Contains the link to the parent project, the project description, access |
| rights, label definitions, submit requirements and options to control |
| project-specific behavior. |
| * link:#file-groups[groups]: |
| Resolves group names that are mentioned in `project.config` to group UUIDs. |
| * [DEPRECATED] link:#file-rules_pl[rules.pl]: |
| Contains Prolog rules that control when a change becomes ready to submit. |
| Note, Prolog rules are deprecated and have been replaced by |
| link:config-submit-requirements.html[submit requirements]. |
| |
| In addition, there can be configuration files from Gerrit plugins, usually they |
| are named `<PLUGIN-NAME>.config`. |
| |
| [[update]] |
| == Updating the project configuration |
| |
| There are several possibilities to update the project configuration: |
| |
| [[update-through-web-ui]] |
| * Through the Gerrit web UI: |
| + |
| [[update-through-general-screen]] |
| -- |
| * On the project's `General` screen: |
| + |
| The `General` screen can be found under: |
| `BROWSE` > `Repositories` > `<project-name>` > `General` |
| + |
| In the `Configurations` section this screen allows to edit the project |
| description and change repository options. |
| + |
| Note, this screen only supports changing the most important repository options, |
| but it doesn't expose all options that exist. |
| + |
| All changes are directly applied (without code review). |
| -- |
| + |
| [[update-through-access-screen]] |
| -- |
| * On the project's `Access` screen: |
| + |
| The `Access` screen can be found under: |
| `BROWSE` > `Repositories` > `<project-name>` > `Access` |
| + |
| This screen allows to edit the project's access rights and the parent project. |
| + |
| Updating access rights via the `Access` screen updates the |
| link:#file-groups[groups] file automatically. |
| + |
| Modifications can either be applied directly (`SAVE` button) or saved for |
| review (`SAVE FOR REVIEW` button). |
| + |
| Saving access modification for review (`SAVE FOR REVIEW` button) creates an |
| open change for the `refs/meta/config` branch where the modifications can be |
| reviewed by a project owner. The modifications become effective only after a |
| project owner submits the change. |
| -- |
| + |
| [[update-via-online-editing]] |
| -- |
| ** Via online editing: |
| + |
| The project's `Commands` screen, that can be found under `BROWSE` > |
| `Repositories` > `<project-name>` > `Commands`, offers an `EDIT REPO CONFIG` |
| command that allows to edit the `project.config` file directly in the Gerrit |
| web UI. |
| + |
| The `EDIT REPO CONFIG` command creates a new work-in-progress change with a |
| change edit that contains the `project.config` file. Clicking on the command |
| opens an online editor for the `project.config` file, allowing the user to make |
| modifications to it. |
| + |
| Modifications need to be saved and published ("saving" saves the modifications |
| in the change edit, "publishing" publishes the change edit to make it visible |
| to other users). While the change edit is not published yet, it's possible to |
| add further files to it (e.g. the link:#file-groups[groups] file if it needs to |
| be modified, in contrast to making access rights changes through the `Access` |
| screen the `groups` file is not automatically updated). For further details how |
| to work with change edits see the link:user-inline-edit.html[inline edit user |
| guide]. After publishing the change edit, the change should be set to ready by |
| clicking on `START REVIEW` > `SEND AND START REVIEW`. At this time you also |
| want to add a project owner as a reviewer so that they can review and approve |
| the change. |
| -- |
| |
| [[update-by-git-push]] |
| * By pushing updates via Git: |
| + |
| Since the configuration files are stored in a git branch, it's possible to |
| update them via normal git operations: |
| + |
| -- |
| 1. Clone the repository if you don't have it available yet. The clone command |
| can be found in the `Download` section of project's `General` screen |
| (`BROWSE` > `Repositories` > `<project-name>` > `General`). |
| 2. Fetch and checkout the `refs/meta/config branch`, e.g. by `git fetch origin |
| refs/meta/config && git checkout FETCH_HEAD`. |
| 3. Edit the `project.config` file or other configuration files and commit the |
| changes, e.g. by `git commit --all`. Note, since the `project.config` file |
| uses the format of a git config file you can also edit it via the |
| `git config` command (e.g. to set a project description do: `git config -f |
| project.config project.description "My project description"`). |
| 4. Push the newly created commit, either to update the `refs/meta/config` |
| branch directly without code-review (e.g. `git push origin |
| HEAD:refs/meta/config`), or for review (e.g. `git push origin |
| HEAD:refs/for/refs/meta/config`). |
| -- |
| + |
| [NOTE] |
| Updates to access right may require changes in the link:#file-groups[groups] |
| file. In contrast to making access rights changes through the `Access` screen |
| the `groups` file is not automatically updated. |
| |
| [[update-through-rest-api]] |
| * Through the Gerrit REST API: |
| + |
| Gerrit offers several REST endpoints to modify the project configuration: |
| + |
| ** link:rest-api-projects.html#set-config[Set Config] REST endpoint: |
| Allows to edit the project description and change repository options. |
| ** link:rest-api-projects.html#set-project-description[Set Project Description] |
| REST endpoint: |
| Allows to set the project description. |
| ** link:rest-api-projects.html#delete-project-description[Delete Project |
| Description] REST endpoint: |
| Allows to unset the project description. |
| ** link:rest-api-projects.html#set-access[Add, Update and Delete Access Rights |
| for Project] REST endpoint: |
| Allows to edit the access rights of the project. |
| ** link:rest-api-projects.html#create-access-change[Create Access Rights Change |
| for review] REST endpoint: |
| Allows to create a change with access right modifications that can be |
| reviewed and submitted by a project owner. |
| ** link:rest-api-projects.html#create-label[Create Label] REST endpoint: |
| Allows to create a new label definition. |
| ** link:rest-api-projects.html#set-label[Set Label] REST endpoint: |
| Allows to update an existing label definition. |
| ** link:rest-api-projects.html#delete-label[Delete Label] REST endpoint: |
| Allows to delete an existing label definition. |
| ** link:rest-api-projects.html#create-submit-requirement[Create Submit |
| Requirement] REST endpoint: |
| Allows to create a new submit requirement. |
| ** link:rest-api-projects.html#update-submit-requirement[Update Submit |
| Requirement] REST endpoint: |
| Allows to update an existing submit requirement. |
| ** link:rest-api-projects.html#delete-submit-requirement[Delete Submit |
| Requirement] REST endpoint: |
| Allows to delete an existing submit requirement. |
| |
| [[required-permissions]] |
| == Required permissions |
| |
| Depending on how the project configuration is changed different access rights |
| are required: |
| |
| * Direct updates through the web UI (link:#update-through-general-screen[ |
| updates through the `General` screen] and link:#update-through-access-screen[ |
| direct updates of access rights through the `Access` screen via the `SAVE` |
| button]) and direct updates through the REST API (via the |
| link:rest-api-projects.html#set-config[Set Config] REST endpoint or the |
| link:rest-api-projects.html#set-access[Add, Update and Delete Access Rights |
| for Project] REST endpoint) require the user to be a project owner (have the |
| link:access-control.html#category_owner[Owner] access right assigned on |
| `refs/*` or have the link:access-control.html#capability_administrateServer[ |
| Administrate Server] global capability assigned on the `All-Projects` root |
| project). |
| * link:#update-by-git-push[Direct updates through `git push`] require the |
| user to have the link:access-control.html#category_push[Push] access right |
| assigned on `refs/meta/config` and be a project owner (have the |
| link:access-control.html#category_owner[Owner] access right assigned on |
| `refs/*` or have the link:access-control.html#capability_administrateServer[ |
| Administrate Server] global capability assigned on the `All-Projects` root |
| project). |
| * Creating changes for updates through the web UI |
| (link:#update-through-access-screen[proposing updates of access rights |
| through the `Access` screen via the `SAVE FOR REVIEW` button] and |
| link:#update-via-online-editing[proposing updates via the `EDIT REPO CONFIG` |
| command]), creating changes for updates through the REST API (via the |
| link:rest-api-projects.html#create-access-change[Create Access Rights Change |
| for review] REST endpoint) and link:#update-by-git-push[pushing changes for |
| review] require the user to be able to see the `refs/meta/config` branch |
| (have the link:access-control.html#category_read[Read] access right assigned |
| on `refs/meta/config`) and be allowed to create changes for it (have the |
| link:access-control.html#category_push[Push] access right assigned on |
| `refs/for/refs/meta/config` or be a project owner or be an administrator). |
| |
| [[comments]] |
| === Comments in project configuration files |
| |
| In principle it's possible to have comments in the project configuration files |
| (lines starting with '#'), however if any Gerrit API is used that lead to |
| modifications in the configuration files the comments may be dropped. This is |
| because when Gerrit parses the configuration files and writes them back with |
| updates, comments are not preserved. |
| |
| [TIP] |
| When updating the project configuration use the commit message to record the |
| reason for the settings so that this information is preserved in the git |
| history. For example, this allows using `git blame` to inspect why |
| configuration values have been set. |
| |
| [[inheritance]] |
| == Inheritance |
| |
| Projects in Gerrit are organized hierarchically in a tree with the |
| `All-Projects` project as the root project. The parent project is defined in |
| the link:#access.inheritFrom[access section] of the `project.config` file. |
| |
| Projects inherit access rights and options from their parent project, but not |
| all options are inheritable. See the description of the options in the |
| link:#file-project_config[project.config] file to learn whether they are |
| inherited or not. |
| |
| Options with boolean values support a special `INHERIT` value to make them |
| inherit the value that is set in the parent project. |
| |
| Some settings can be enforced for child projects (or if set on the |
| `All-Projects` root project for all projects), e.g. access right restrictions |
| via link:access-control#block[BLOCK rules] or |
| link:config-submit-requirements.html#submit_requirement_can_override_in_child_projects[ |
| non-overridable] submit requirements. |
| |
| [NOTE] |
| The parent project for an existing project can be changed via the |
| link:update-through-access-screen[Access] screen (by default this is only |
| allowed for administrators). |
| |
| [NOTE] |
| Project owners can be allowed to change the parent of projects that they own |
| (see link:config-gerrit.html#receive.allowProjectOwnersToChangeParent[ |
| receive.allowProjectOwnersToChangeParent] setting which is `false` by default). |
| In this case project owners may escape the settings that are enforced by their |
| parent project by choosing a different parent project. |
| |
| [[file-project_config]] |
| == The file `project.config` |
| |
| The `project.config` file contains the link to the parent project, the project |
| description, access rights, link:config-labels.html[label definitions], |
| link:config-submit-requirements.html[submit requirements] and options to |
| control project-specific behavior. |
| |
| The format in this file corresponds to the Git config file format. |
| |
| [TIP] |
| -- |
| Since the format of the `project.config` file adheres to the Git config file |
| format, utilizing the `git config` command when modifying the file is |
| recommended. This way you can avoid breaking the format of the file |
| accidentally. |
| |
| Here is an example of a `git config` command that updates the project |
| description: |
| |
| ---- |
| $ git config -f project.config project.description "Foo Bar" |
| ---- |
| -- |
| |
| This is an example of a `project.config` file: |
| |
| ---- |
| [project] |
| description = Collection of scripts for setting up foo bar. |
| [access "refs/*"] |
| read = group Registered Users |
| [access "refs/heads/*"] |
| label-Code-Review = -2..+2 group Maintainers |
| label-Code-Review = -1..+1 group Registered Users |
| label-Your-Label = -1..+1 group Maintainers |
| [receive] |
| requireChangeId = true |
| [label "Your-Label"] |
| function = NoOp |
| value = -1 Your -1 Description |
| value = 0 Your No score Description |
| value = +1 Your +1 Description |
| [submit-requirement "Your-Label"] |
| description = At least one maximum vote for label 'Your-Label' is required |
| applicableIf = -branch:refs/meta/config |
| submittableIf = label:Your-Label=MAX AND -label:Your-Label=MIN |
| ---- |
| |
| The sections that can appear in the `project.config` file are explained below. |
| |
| [[access-section]] |
| === Access section |
| |
| [[access.inheritFrom]]access.inheritFrom:: |
| + |
| Name of the parent project from which access rights are inherited. |
| + |
| If not set, access rights are inherited from the `All-Projects` root project. |
| |
| [[access-subsection]] |
| ==== Access subsection |
| |
| `access` subsections define access rules for a ref or a ref namespace. The ref |
| or ref namespace is specified as the subsection name and can be a concrete ref |
| (e.g. `refs/heads/master`), a ref pattern (last path segment is '\*', e.g. |
| `refs/heads/*`) or a regular expression (must start with '^', e.g. |
| `^refs/heads/rel-.*`). |
| |
| [NOTE] |
| For ref patterns '\*' can only appear as the last path segment. If a '*' is |
| required in any other place the ref namespace must be specified as a regular |
| expression (must start with '^', '\*' must follow what's being matched, e.g. |
| ".*" to match any string). |
| |
| [NOTE] |
| Only one access subsection per ref and per ref namespace is allowed. |
| |
| The `access` subsections contain access rules that apply to the ref or ref |
| namespace of the `access` subsections. The format of the access rules is: + |
| `<accessCategoryId> = (block|deny)? <range>? group <group-name>` |
| |
| * `<accessCategoryId>`: ID of the link:access-control.html#access_categories[ |
| access category] for which the access rule should be defined. The ID of the |
| access category is the name of the access category in lowerCamelCase (e.g. |
| `createTag`), except for label permissions where it is `label-<label-Name>` |
| (e.g. `label-Code-Review`). |
| * `(block|deny)?`: `block` defines a link:access-control.html#block-rule[BLOCK] |
| rule, `deny` defines a link:access-control.html#deny-rule[DENY] rule, if |
| neither `block` or `deny` is specified an link:access-control.html#allow-rule[ |
| ALLOW] rule is defined. |
| * `<range>?`: Only set for label permission. The voting range in the format |
| `<min-vote>..<max-vote>` (e.g. `-1..+1`). |
| * `group <group-name>`: The (local) name of the group to which the access rule |
| should apply (e.g. `group Foo Bar`). The (local) group name must exist in the |
| link:#file-groups[groups] file, so that Gerrit can resolve it to the group |
| UUID. |
| |
| To make access rules link:access-control.html#exclusive[exclusive] they need to |
| be included into the value of the `exclusiveGroupPermissions` key: + |
| `exclusiveGroupPermissions = <space-separated-list-of-access-category-ids>` |
| |
| .Example access subsections |
| ---- |
| [access "refs/heads/*"] |
| create = group Administrators |
| delete = group Administrators |
| deleteChanges = group Administrators |
| label-Code-Review = -2..+2 group Maintainers |
| label-Code-Review = -1..+1 group Registered Users |
| label-Verified = -1..+1 group Registered Users |
| push = block Registered Users |
| submit = group Maintainers |
| exclusiveGroupPermissions = deleteChanges submit |
| [access "^refs/tags/rel-.*"] |
| createTag = group Maintainers |
| createSignedTag = group Maintainers |
| ---- |
| |
| [[branchOrder-section]] |
| === branchOrder section |
| |
| Defines a branch ordering which is used for backporting of changes. |
| Backporting will be offered for a change (in the Gerrit UI) for all |
| more stable branches where the change can merge cleanly. |
| |
| [[branchOrder.branch]]branchOrder.branch:: |
| |
| A branch name, typically multiple values will be defined. The order of branch |
| names in this section defines the branch order. The topmost is considered to be |
| the least stable branch (typically the master branch) and the last one the |
| most stable (typically the last maintained release branch). |
| |
| .Example: |
| ---- |
| [branchOrder] |
| branch = master |
| branch = stable-2.9 |
| branch = stable-2.8 |
| branch = stable-2.7 |
| ---- |
| |
| The `branchOrder` section is inheritable. This is useful when multiple or all |
| projects follow the same branch rules. A `branchOrder` section in a child |
| project completely overrides any `branchOrder` section from a parent i.e. there |
| is no merging of `branchOrder` sections. A present but empty `branchOrder` |
| section removes all inherited branch order. |
| |
| Branches not listed in this section will not be included in the mergeability |
| check. If the `branchOrder` section is not defined then the mergeability of a |
| change into other branches will not be computed. |
| |
| [[capability-section]] |
| === Capability section |
| |
| The `capability` section only appears once, and only in the `project.config` |
| file of the `All-Projects` root project. It controls Gerrit administration |
| capabilities that are configured on a global level. |
| |
| .Example: |
| ---- |
| [capability] |
| administrateServer = group Administrators |
| ---- |
| |
| [NOTE] |
| The (local) group names for which capabilities are assigned must exist in the |
| link:#file-groups[groups] file, so that Gerrit can resolve them to their group |
| UUID. |
| |
| Please refer to the |
| link:access-control.html#global_capabilities[Global Capabilities] |
| documentation for a full list of available capabilities. |
| |
| [[change-section]] |
| === Change section |
| |
| The change section includes configuration for project-specific change settings: |
| |
| [[change.privateByDefault]]change.privateByDefault:: |
| + |
| Controls whether all new changes in the project are set as private by default. |
| + |
| Note that a new change will be public if the `is_private` field in |
| link:rest-api-changes.html#change-input[ChangeInput] is set to `false` explicitly |
| when calling the link:rest-api-changes.html#create-change[CreateChange] REST API |
| or the `remove-private` link:user-upload.html#private[PushOption] is used during |
| the Git push. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. |
| |
| [[change.workInProgressByDefault]]change.workInProgressByDefault:: |
| + |
| Controls whether all new changes in the project are set as WIP by default. |
| + |
| Note that a new change will be ready if the `workInProgress` field in |
| link:rest-api-changes.html#change-input[ChangeInput] is set to `false` explicitly |
| when calling the link:rest-api-changes.html#create-change[CreateChange] REST API |
| or the `ready` link:user-upload.html#wip[PushOption] is used during |
| the Git push. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. |
| |
| [[commentlink-section]] |
| === Commentlink section |
| |
| Optionally a `commentlink` section can be added to define project-specific |
| comment links. The `commentlink` section has the same format as the |
| link:config-gerrit.html#commentlink[commentlink] section in `gerrit.config` |
| which is used to define global comment links. |
| |
| [[label-section]] |
| === Label section |
| |
| Please refer to link:config-labels.html#label_custom[Custom Labels] documentation. |
| |
| [[mimetype-section]] |
| === MIME Types section |
| |
| The +mimetype+ section may be configured to force the web code |
| reviewer to return certain MIME types by file path. MIME types |
| may be used to activate syntax highlighting. |
| |
| ---- |
| [mimetype "text/x-c"] |
| path = *.pkt |
| [mimetype "text/x-java"] |
| path = api/current.txt |
| ---- |
| |
| [[project-section]] |
| === Project section |
| |
| The project section includes configuration of project settings. |
| |
| These are the keys: |
| |
| [[description]]description:: |
| + |
| A description for the project. |
| |
| [[state]]state:: |
| + |
| This setting defines the state of the project. A project can have the |
| following states: |
| |
| - `Active`: |
| + |
| The project is active and users can see and modify the project according |
| to their access rights on the project. |
| |
| - `Read Only`: |
| + |
| The project is read only and all modifying operations on it are |
| disabled. E.g. this means that pushing to this project fails for all |
| users even if they have push permissions assigned on it. |
| + |
| Setting a project to this state is an easy way to temporary close a |
| project, as you can keep all write access rights in place and they will |
| become active again as soon as the project state is set back to |
| `Active`. |
| + |
| This state also makes sense if a project was moved to another location. |
| In this case all new development should happen in the new project and |
| you want to prevent that somebody accidentally works on the old |
| project, while keeping the old project around for old references. |
| |
| - `Hidden`: |
| + |
| The project is hidden; It will not appear in any searches and is only visible |
| to project owners by going directly to the repository admin page. Other users |
| are not able to see the project even if they have read permissions granted on |
| the project. |
| |
| |
| [[receive-section]] |
| === Receive section |
| |
| The receive section includes configuration of project-specific |
| receive settings: |
| |
| [[receive.requireContributorAgreement]]receive.requireContributorAgreement:: |
| + |
| Controls whether or not a user must complete a contributor agreement before |
| they can upload changes. Default is `INHERIT`. If `All-Projects` enables this |
| option then the dependent project must set it to false if users are not |
| required to sign a contributor agreement prior to submitting changes for that |
| specific project. To use that feature the global option in `gerrit.config` |
| must be enabled: |
| link:config-gerrit.html#auth.contributorAgreements[auth.contributorAgreements]. |
| |
| [[receive.requireSignedOffBy]]receive.requireSignedOffBy:: |
| + |
| Sign-off can be a requirement for some projects (for example Linux kernel uses |
| it). Sign-off is a line at the end of the commit message which certifies who |
| is the author of the commit. Its main purpose is to improve tracking of who |
| did what, especially with patches. Default is `INHERIT`, which means that this |
| property is inherited from the parent project. |
| |
| [[receive.requireChangeId]]receive.requireChangeId:: |
| + |
| The `Require Change-Id in commit message` option defines whether a |
| link:user-changeid.html[Change-Id] in the commit message is required |
| for pushing a commit for review. If this option is set, trying to push |
| a commit for review that doesn't contain a Change-Id in the commit |
| message fails with link:error-missing-changeid.html[missing Change-Id |
| in commit message footer]. |
| + |
| It is recommended to set this option and use a |
| link:user-changeid.html#create[commit-msg hook] (or other client side |
| tooling like EGit) to automatically generate Change-Id's for new |
| commits. This way the Change-Id is automatically in place when changes |
| are reworked or rebased and uploading new patch sets gets easy. |
| + |
| If this option is not set, commits can be uploaded without a Change-Id, |
| but then users have to remember to copy the assigned Change-Id from the |
| change screen and insert it manually into the commit message when they |
| want to upload a second patch set. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. The global default for new hosts is `true` |
| + |
| This option is deprecated and future releases will behave as if this |
| is always `true`. |
| |
| [[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. |
| + |
| Project owners can use this setting to prevent developers from pushing |
| objects which are too large to Gerrit. This setting can also be set in |
| `gerrit.config` globally (link:config-gerrit.html#receive.maxObjectSizeLimit[ |
| receive.maxObjectSizeLimit]). |
| + |
| The project specific setting in `project.config` may not set a value higher |
| than the global limit (if configured). In other words, it is only honored when |
| it further reduces the global limit. |
| + |
| When link:config-gerrit.html#receive.inheritProjectMaxObjectSizeLimit[ |
| `receive.inheritProjectmaxObjectSizeLimit`] is enabled in the global config, |
| the value is inherited from the parent project. Otherwise, it is not inherited |
| and must be explicitly set per project. |
| + |
| Default is zero. |
| + |
| Common unit suffixes of k, m, or g are supported. |
| |
| [[receive.checkReceivedObjects]]receive.checkReceivedObjects:: |
| + |
| Controls whether or not the JGit functionality for checking received objects |
| is enabled. |
| + |
| By default Gerrit checks the validity of git objects. Setting this variable to |
| false should not be used unless a project with history containing invalid |
| objects needs to be pushed into a Gerrit repository. |
| + |
| This functionality is provided as some other git implementations have allowed |
| bad history to be written into git repositories. If these repositories need pushing |
| up to Gerrit then the JGit checks need to be disabled. |
| + |
| The default value for this is true, false disables the checks. |
| |
| [[receive.enableSignedPush]]receive.enableSignedPush:: |
| + |
| Controls whether server-side signed push validation is enabled on the |
| project. Only has an effect if signed push validation is enabled on the |
| server; see the link:config-gerrit.html#receive.enableSignedPush[global |
| configuration] for details. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. |
| |
| [[receive.requireSignedPush]]receive.requireSignedPush:: |
| + |
| Controls whether server-side signed push validation is required on the |
| project. Only has an effect if signed push validation is enabled on the |
| server, and link:#receive.enableSignedPush[`receive.enableSignedPush`] is |
| set on the project. See the |
| link:config-gerrit.html#receive.enableSignedPush[global configuration] |
| for details. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. |
| |
| [[receive.rejectImplicitMerges]]receive.rejectImplicitMerges:: |
| + |
| Controls whether a check for implicit merges will be performed when changes are |
| pushed for review. An implicit merge is a case where merging an open change |
| would implicitly merge another branch into the target branch. Typically, this |
| happens when a change is done on master and, by mistake, pushed to a stable branch |
| for review. When submitting such change, master would be implicitly merged into |
| stable without anyone noticing that. When this option is set to 'true' Gerrit |
| will reject the push if an implicit merge is detected. |
| + |
| This check is only done for non-merge commits, merge commits are not subject of |
| the implicit merge check. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. |
| |
| [[receive.createNewChangeForAllNotInTarget]]receive.createNewChangeForAllNotInTarget:: |
| + |
| This option provides a convenience for selecting |
| link:user-upload.html#base[the merge base] by setting it automatically |
| to the target branch's tip so you can create new changes for all |
| commits not in the target branch. |
| + |
| This option is disabled if the tip of the push is a merge commit. |
| + |
| This option also only works if there are no merge commits in the |
| commit chain, in such cases it fails warning the user that such |
| pushes can only be performed by manually specifying |
| link:user-upload.html#base[bases] |
| + |
| This option is useful if you want to push a change to your personal |
| branch first and for review to another branch for example. Or in cases |
| where a commit is already merged into a branch and you want to create |
| a new open change for that commit on another branch. |
| |
| [[reviewer-section]] |
| === reviewer section |
| |
| Defines config options to adjust a project's reviewer workflow such as enabling |
| reviewers and CCs by email. |
| |
| [[reviewer.enableByEmail]]reviewer.enableByEmail:: |
| + |
| A boolean indicating if reviewers and CCs that do not currently have a Gerrit |
| account can be added to a change by providing their email address. |
| + |
| This setting only takes effect for changes that are readable by anonymous users. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. If the property is not set in any parent project, the |
| default value is `FALSE`. |
| |
| [[reviewer.skipAddingAuthorAndCommitterAsReviewers]]reviewer.skipAddingAuthorAndCommitterAsReviewers:: |
| + |
| Whether to skip adding the Git commit author and committer as reviewers for |
| a new change. |
| + |
| Default is `INHERIT`, which means that this property is inherited from |
| the parent project. If the property is not set in any parent project, the |
| default value is `FALSE`. |
| |
| [[submit-section]] |
| === Submit section |
| |
| The submit section includes configuration of project-specific |
| submit settings: |
| |
| [[content_merge]] |
| |
| [[submit.mergeContent]]submit.mergeContent:: |
| + |
| Defines whether Gerrit will try to do a content merge when a path conflict |
| occurs while submitting a change. |
| + |
| A path conflict occurs when the same file has been changed on both sides of a |
| merge, e.g. when the same file has been touched in a change and concurrently in |
| the target branch. |
| + |
| Doing a content merge means that Gerrit attempts to merge the conflicting file |
| contents from both sides of the merge. This is successful if the touched lines |
| (plus some surrounding context lines) do not overlap (i.e. both sides touch |
| distinct lines). |
| + |
| NOTE: The content merge setting is not relevant when |
| link:#fast_forward_only[fast forward only] is configured as the |
| link:#submit.action[submit action] because in this case Gerrit will never |
| perform a merge, rebase or cherry-pick on submit. |
| + |
| If content merges are disabled, the submit button in the Gerrit web UI is |
| disabled, if any path conflict would occur on submitting the change. Users then |
| need to rebase the change manually to resolve the path conflict and then get |
| the change re-approved so that they can submit it. |
| + |
| NOTE: If only distinct lines have been touched on both sides, rebasing the |
| change from the Gerrit UI is sufficient to resolve the path conflict, since the |
| rebase action always does the rebase with content merge enabled. |
| + |
| The advantage of enabling content merges on submit is that it makes it less |
| likely that change submissions are rejected due to conflicts. Each change |
| submission that goes through with content merge, but would be rejected |
| otherwise, saves the user from needing to do extra work to get the change |
| submitted (rebase the change, get it re-approved and then submit it again). |
| + |
| On the other hand, disabling content merges decreases the chance of breaking |
| branches by submitting content merges of incompatible modifications in the same |
| file, e.g. a function is removed on one side and a new usage of that function |
| is added on the other side. Note, that the chance of breaking a branch by |
| incompatible modifications is only reduced, but not eliminated, e.g. even with |
| content merges disabled it's possible that a function is removed in one file |
| and a new usage of that function is added in another file. |
| + |
| The huge drawback of disabling content merge is that users need to do extra |
| work when a change isn't submittable due to a path conflict which could be |
| avoided if content merge was enabled (see above). In addition to this, it also |
| confuses and frustrates users if a change submission is rejected by Gerrit due |
| to a path conflict, but then when they rebase the change manually they do not |
| see any conflict (because manual rebases are always done with content merge |
| enabled). |
| + |
| In general, the stability gain of disabling content merges is not worth the |
| overhead and confusion that this adds for users, which is why disabling content |
| merges is highly discouraged. |
| + |
| Valid values are `true`, `false`, or `INHERIT`. |
| + |
| The default is `INHERIT`. |
| + |
| NOTE: Project owners can also set this option in the Gerrit UI: |
| `Browse` > `Repositories` > my/repository > `Allow content merges`. |
| |
| [[submit.action]]submit.action:: |
| + |
| Defines the submit action aka submit type aka submit strategy that Gerrit |
| should use to integrate changes into the target branch when they are submitted. |
| + |
| In general, submitting a change only merges the change if all its dependencies |
| are also submitted. The only exception is the `cherry pick` submit action which |
| ignores dependencies and hence is not recommended to be used (see |
| link:#cherry_pick[below]). |
| + |
| [[submit-type]] |
| -- |
| The following submit actions are supported: |
| |
| [[merge_if_necessary]] |
| * 'merge if necessary': |
| + |
| With this action, when a change is being submitted, Gerrit fast-forwards the |
| target branch if possible, and otherwise creates a merge commit automatically. |
| + |
| A fast-forward is possible if the commit that represents the current patch set |
| of the change has the current head of the target branch in its parent lineage. |
| + |
| If a fast-forward is not possible, Gerrit automatically creates a merge commit |
| that merges the current patch set of the change into the target branch and then |
| the target branch is fast-forwarded to the merge commit. |
| + |
| The behavior of this submit action is identical with the classical `git merge` |
| behavior, or |
| link:https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---ff[git |
| merge --ff]. |
| + |
| With this submit action the commits that have been reviewed and approved are |
| retained in the git history of the target branch. This means, by looking at the |
| history of the target branch, you can see for all commits when they were |
| originally committed and on which parent commit they were originally based. |
| |
| [[always_merge]] |
| [[merge_always]] |
| * 'merge always': |
| + |
| With this action, when a change is being submitted, Gerrit always creates a |
| merge commit, even if a fast-forward is possible. |
| + |
| This is identical to the behavior of |
| link:https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---no-ff[git merge --no-ff]. |
| + |
| With this submit action the commits that have been reviewed and approved are |
| retained in the git history of the target branch. This means, by looking at the |
| history of the target branch, you can see for all commits when they were |
| originally committed and on which parent commit they were originally based. In |
| addition, from the merge commits you can see when the changes were submitted |
| and it's possible to follow submissions with `git log --first-parent`. |
| |
| [[rebase_if_necessary]] |
| * 'rebase if necessary': |
| + |
| With this action, when a change is being submitted, Gerrit fast-forwards the |
| target branch if possible, and otherwise does a rebase automatically. |
| + |
| A fast-forward is possible if the commit that represents the current patch set |
| of the change has the current head of the target branch in its parent lineage. |
| + |
| If a fast-forward is not possible, Gerrit automatically rebases the current |
| patch set of the change on top of the current head of the target branch and |
| then the target branch is fast-forwarded to the rebased commit. |
| + |
| With this submit action, when a rebase is performed, the original commits that |
| have been reviewed and approved do not become part of the target branch's |
| history. This means the information on when the original commits were committed |
| and on which parent they were based is not retained in the branch history. |
| + |
| Using this submit action results in a linear history of the target branch, |
| unless merge commits are being submitted. For some people this is an advantage |
| since they find the linear history easier to read. |
| + |
| NOTE: Rebasing merge commits is done by rebasing their first parent commit, |
| i.e. the first parent is updated to the new base while the second parent stays |
| intact. |
| |
| [[rebase_always]] |
| * 'rebase always': |
| + |
| With this action, when a change is being submitted, Gerrit always does a |
| rebase, even if a fast-forward is possible. |
| + |
| With this submit action, the original commits that have been reviewed and |
| approved do not become part of the target branch's history. This means the |
| information on when the original commits were committed and on which parent |
| they were based is not retained in the branch history. |
| + |
| Using this submit action results in a linear history of the target branch, |
| unless merge commits are being submitted. For some people this is an advantage |
| since they find the linear history easier to read. |
| + |
| NOTE: Rebasing merge commits is done by rebasing their first parent commit, |
| i.e. the first parent is updated to the new base while the second parent stays |
| intact. |
| + |
| When rebasing the patchset, Gerrit automatically appends onto the end of the |
| commit message a short summary of the change's approvals, and a URL link back |
| to the change in the web UI (see link:#submit-footers[below]). |
| + |
| The footers that are added are exactly the same footers that are also added by |
| the link:#cherry_pick[cherry pick] action. Thus, the `rebase always` action can |
| be considered similar to the `cherry pick` action, but with the important |
| distinction that `rebase always` does not ignore dependencies, which is why |
| using the `rebase always` action should be preferred over the `cherry pick` |
| submit action. |
| |
| [[fast_forward_only]] |
| * 'fast forward only' (usage generally not recommended): |
| + |
| With this action a change can only be submitted if at submit time the target |
| branch can be fast-forwarded to the commit that represents the current patch |
| set of the change. This means in order for a change to be submittable its |
| current patch set must have the current head of the target branch in its parent |
| lineage. |
| + |
| The advantage of using this action is that the target branch is always updated |
| to the exact commit that has been reviewed and approved. In particular, if CI |
| verification is configured, this means that the CI verified the exact commit to |
| which the target branch is being fast-forwarded on submit (assuming no approval |
| copying is configured for CI votes). |
| + |
| The huge drawback of using this action is that whenever one change is submitted |
| all other open changes for the same branch, that are not successors of the |
| submitted change, become non-submittable, since the target branch can no longer |
| be fast-forwarded to their current patch sets. Making these changes submittable |
| again requires rebasing and re-approving/re-verifying them. For most projects |
| this causes an unreasonable amount of overhead that doesn't justify the |
| stability gain by verifying exact commits so that using this submit action is |
| generally discouraged. Using this action should only be considered for projects |
| that have a low frequency of changes and that have special requirements to |
| never break any target branch. |
| + |
| NOTE: With this submit action Gerrit does not create merge commits on |
| submitting a change, but merge commits that are created on the client, prior to |
| uploading to Gerrit for review, may still be submitted. |
| |
| [[cherry_pick]] |
| * 'cherry pick' (usage not recommended, use link:#rebase_always[rebase always] |
| instead): |
| + |
| With this submit action Gerrit always performs a cherry pick of the current |
| patch set when a change is submitted. This ignores the parent lineage and |
| instead creates a brand new commit on top of the current head of the target |
| branch. The submitter becomes the committer of the new commit and the original |
| commit author is retained. |
| + |
| Ignoring change dependencies on submit is often confusing for users. For users |
| that stack changes on top of each other, it's unexpected that these |
| dependencies are ignored on submit. Ignoring dependencies also means that |
| submitters need to submit the changes individually in the correct order. |
| Otherwise it's likely that submissions fail due to conflicts or that the |
| target branch gets broken (because it contains the submitted change, but not |
| its predecessors which may be required for the submitted change to work |
| correctly). |
| + |
| If link:config-gerrit.html#change.submitWholeTopic[`change.submitWholeTopic`] |
| is enabled changes that have the same topic are submitted together, the same as |
| with all other submit actions. This means by setting the same topic on all |
| dependent changes it's possible to submit a stack of changes together and |
| overcome the limitation that change dependencies are ignored. |
| + |
| When cherry picking the patchset, Gerrit automatically appends onto the end of |
| the commit message a short summary of the change's approvals, and a URL link |
| back to the change in the web UI (see link:#submit-footers[below]). |
| + |
| Using this submit action is not recommended because it ignores change |
| dependencies, instead link:#rebase_always[rebase always] should be used which |
| behaves the same way except that it respects change dependencies (in particular |
| `rebase always` adds the same kind of footers to the merged commit as |
| `cherry pick`). |
| |
| -- |
| + |
| [[submit_type_inherit]] |
| In addition the submit action can be set to `Inherit`, which means that the |
| value that is configured in the parent project applies. For new projects |
| `Inherit` is the default, unless the default is overridden by the global |
| link:config-gerrit.html#repository.name.defaultSubmitType[defaultSubmitType] |
| configuration. Configuring `Inherit` for the `All-Projects` root project is |
| equivalent to configuring link:#merge_if_necessary[merge if necessary]. |
| + |
| If `submit.action` is not set, the default is 'merge if necessary'. |
| + |
| NOTE: The different submit actions are also described in the |
| link:https://docs.google.com/presentation/d/1C73UgQdzZDw0gzpaEqIC6SPujZJhqamyqO1XOHjH-uk/edit#slide=id.g4d6c16487b_1_800[Gerrit - Concepts and Workflows] |
| presentation, where their behavior is visualized by git commit graphs. |
| + |
| NOTE: If Gerrit performs a merge, rebase or cherry-pick as part of the |
| change submission (true for all submit actions, except for |
| link:#fast_forward_only[fast forward only]), it is controlled by the |
| link:#submit.mergeContent[mergeContent] setting whether a content merge is |
| performed when there is a path conflict. |
| + |
| NOTE: If Gerrit performs a merge, rebase or cherry-pick as part of the |
| change submission (true for all submit actions, except for |
| link:#fast_forward_only[fast forward only]), it can be that trying to submit |
| a change would fail due to Git conflicts (if the same lines were modified |
| concurrently, or if link:#submit.mergeContent[mergeContent] is disabled also if |
| the same files were modified concurrently). In this case the submit button in |
| the Gerrit web UI is disabled and a tooltip on the disabled submit button |
| informs about the change being non-mergeable. |
| + |
| [[submit-footers]] |
| -- |
| NOTE: If Gerrit performs a rebase or cherry-pick as part of the change |
| submission (true for link:#rebase_if_necessary[rebase if necessary], |
| link:#rebase_always[rebase always] and link:#cherry_pick[cherry pick]) Gerrit |
| inserts additional footers into the commit message of the newly created |
| commit: + |
| + |
| * `Change-Id: <change-id>` (only if this footer is not already present, see |
| link:user-changeid.html[Change-Id]) + |
| * `Reviewed-on: <change-url>` (links to the change in Gerrit where this commit |
| was reviewed) + |
| * `Reviewed-by: <reviewer>` (once for every reviewer with a positive |
| `Code-Review` vote) + |
| * `Tested-by: <reviewer>` (once for every reviewer with a positive `Verified` |
| vote) + |
| * `<label-name>: <reviewer>` (once for every reviewer with a positive vote on |
| any other label) + |
| + |
| In addition, plugins that implement a |
| link:dev-plugins.html#change-message-modifier[Change Message Modifier] may add |
| additional custom footers. |
| -- |
| + |
| NOTE: For the value of `submit.action` in `project.config` use the exact |
| spelling as given above, e.g. 'merge if necessary' (without the single quotes, |
| but with the spaces). |
| + |
| NOTE: Project owners can also set the submit action in the Gerrit UI: |
| `Browse` > `Repositories` > my/repository > `Submit type` |
| |
| [[submit.matchAuthorToCommitterDate]]submit.matchAuthorToCommitterDate:: |
| + |
| Defines whether the author date will be changed to match the submitter date upon submit, so that |
| git log shows when the change was submitted instead of when the author last committed. Valid |
| values are 'true', 'false', or 'INHERIT'. The default is 'INHERIT'. This option only takes effect |
| in submit strategies which already modify the commit, i.e. Cherry Pick, Rebase Always, and |
| (when rebase is necessary) Rebase If Necessary. |
| |
| [[submit.rejectEmptyCommit]]submit.rejectEmptyCommit:: |
| + |
| Defines whether empty commits should be rejected when a change is merged. When using |
| link:#submit.action[submit action] Cherry Pick, Rebase If Necessary or Rebase Always changes may |
| become empty upon submit, since the rebase|cherry-pick can lead to an empty commit. If this option |
| is set to 'true' the merge would fail in such a case. An empty commit is still allowed as the |
| initial commit on a branch. |
| |
| [[submit-requirement-section]] |
| === Submit Requirement section |
| |
| Please refer to link:config-submit-requirements.html[Configuring Submit |
| Requirements] documentation. |
| |
| [[file-groups]] |
| == The file `groups` |
| |
| The `groups` file resolves group names that are mentioned in |
| link:#access-subsection[access subsections] of the link:#file-project_config[ |
| project.config] file to group UUIDs. |
| |
| In the access subsections access rights are assigned to group names. These |
| group names are local to the project configuration and do not need to match |
| with the actual group names. To enable Gerrit to resolve the local group names |
| they must be mapped to group UUIDs in the `groups` file. |
| |
| The access sections use local group names, rather than requiring the actual |
| group names, to allow renaming groups in Gerrit without having to rewrite every |
| `project.config` file using the group. |
| |
| The content of the `groups` file is a simple table of group UUID to group name, |
| separated by a tab. |
| |
| This is how the default `groups` file for `All-Projects` project looks like: |
| |
| ---- |
| # UUID Group Name |
| # |
| 3d6da7dc4e99e6f6e5b5196e21b6f504fc530bba Administrators |
| global:Anonymous-Users Anonymous Users |
| global:Change-Owner Change Owner |
| global:Project-Owners Project Owners |
| global:Registered-Users Registered Users |
| ---- |
| |
| Since the `groups` file has a custom format it can't be edited using the |
| `git config` command. |
| |
| Whenever access rights in the `project.config` file are assigned to new groups |
| mapping entries for the new groups must be added to the `groups` file. The |
| modifications to the `groups` file must be included in the same commit that |
| updates the `project.config` file. Pushing updates to `project.config` files |
| that refer to groups not listed in the `groups` file are rejected by Gerrit. |
| |
| When link:#update-through-access-screen[editing access rights through the web |
| UI] the `groups` file is automatically updated by Gerrit. |
| |
| The UUID of a group can be found on the group screen (`BROWSE` > `Groups` > |
| `<group-name>` ). Alternatively the group can be looked up via the |
| link:rest-api-groups.html#get-group[Get Group] REST endpoint (note that the |
| `group-id` in the URL can be the group name). The group UUID is contained as |
| `id` field in the return link:rest-api-groups.html#group-info[GroupInfo] JSON. |
| |
| [[file-rules_pl]] |
| == The file `rules.pl` |
| |
| The `rules.pl` file allows to replace or amend the default Prolog rules that |
| control what conditions need to be fulfilled for a change to be submittable. |
| This file should be interpretable by the 'Prolog Cafe' interpreter. |
| |
| You can read more about prolog rules on the link:prolog-cookbook.html[Prolog |
| cookbook] page. |
| |
| [NOTE] |
| Prolog rules are deprecated and have been replaced by |
| link:config-submit-requirements.html[submit requirements]. |
| |
| GERRIT |
| ------ |
| Part of link:index.html[Gerrit Code Review] |
| |
| SEARCHBOX |
| --------- |