| :linkattrs: | |
| = User Guide | |
| This is a Gerrit guide that is dedicated to Gerrit end-users. It | |
| explains the standard Gerrit workflows and how a user can adapt Gerrit | |
| to personal preferences. | |
| It is expected that readers know about link:http://git-scm.com/[Git,role=external,window=_blank] | |
| and that they are familiar with basic git commands and workflows. | |
| [[gerrit]] | |
| == What is Gerrit? | |
| Gerrit is a Git server that provides link:access-control.html[access | |
| control] for the hosted Git repositories and a web front-end for doing | |
| link:#code-review[code review]. Code review is a core functionality of | |
| Gerrit, but still it is optional and teams can decide to | |
| link:#no-code-review[work without code review]. | |
| [[tools]] | |
| == Tools | |
| Gerrit uses the git protocol. This means in order to work with Gerrit | |
| you do *not* need to install any Gerrit client, but having a regular | |
| git client, such as the link:http://git-scm.com/[git command line,role=external,window=_blank] or | |
| link:http://eclipse.org/egit/[EGit,role=external,window=_blank] in Eclipse, is sufficient. | |
| Still there are some client-side tools for Gerrit, which can be used | |
| optionally: | |
| * link:https://github.com/uwolfer/gerrit-intellij-plugin[Gerrit | |
| IntelliJ Plugin,role=external,window=_blank]: Gerrit integration with the | |
| link:http://www.jetbrains.com/idea/[IntelliJ Platform,role=external,window=_blank] | |
| * link:https://opendev.org/ttygroup/gertty[gertty]: Console-based interface for Gerrit | |
| [[clone]] | |
| == Clone Gerrit Project | |
| Cloning a Gerrit project is done the same way as cloning any other git | |
| repository by using the `git clone` command. | |
| .Clone Gerrit Project | |
| ---- | |
| $ git clone ssh://gerrithost:29418/RecipeBook.git RecipeBook | |
| Cloning into RecipeBook... | |
| ---- | |
| The URL for cloning the project can be found in the Gerrit web UI | |
| under `Projects` > `List` > <project-name> > `General`. | |
| For git operations Gerrit supports the link:user-upload.html#ssh[SSH] | |
| and the link:user-upload.html#http[HTTP/HTTPS] protocols. | |
| [NOTE] | |
| To use SSH you may need to link:user-upload.html#ssh[configure your SSH public | |
| key in your `Settings`]. | |
| [[code-review]] | |
| == Code Review Workflow | |
| With Gerrit _Code Review_ means to link:#review-change[review] every | |
| commit *before* it is accepted into the code base. The author of a code | |
| modification link:user-upload.html#push_create[uploads a commit] as a | |
| change to Gerrit. In Gerrit each change is stored in a | |
| link:#change-ref[staging area] where it can be checked and reviewed. | |
| Only when it is approved and submitted it gets applied to the code | |
| base. If there is feedback on a change, the author can improve the code | |
| modification by link:#upload-patch-set[amending the commit and | |
| uploading the new commit as a new patch set]. This way a change is | |
| improved iteratively and it is applied to the code base only when is | |
| ready. | |
| [[upload-change]] | |
| == Upload a Change | |
| Uploading a change to Gerrit is done by pushing a commit to Gerrit. The | |
| commit must be pushed to a ref in the `refs/for/` namespace which | |
| defines the target branch: `refs/for/<target-branch>`. | |
| The magic `refs/for/` prefix allows Gerrit to differentiate commits | |
| that are pushed for review from commits that are pushed directly into | |
| the repository, bypassing code review. For the target branch it is | |
| sufficient to specify the short name, e.g. `master`, but you can also | |
| specify the fully qualified branch name, e.g. `refs/heads/master`. | |
| .Push for Code Review | |
| ---- | |
| $ git commit | |
| $ git push origin HEAD:refs/for/master | |
| // this is the same as: | |
| $ git commit | |
| $ git push origin HEAD:refs/for/refs/heads/master | |
| ---- | |
| .Push with bypassing Code Review | |
| ---- | |
| $ git commit | |
| $ git push origin HEAD:master | |
| // this is the same as: | |
| $ git commit | |
| $ git push origin HEAD:refs/heads/master | |
| ---- | |
| [[push-fails]] | |
| [NOTE] | |
| If pushing to Gerrit fails consult the Gerrit documentation that | |
| explains the link:error-messages.html[error messages]. | |
| [[change-ref]] | |
| When a commit is pushed for review, Gerrit stores it in a staging area | |
| which is a branch in the special `refs/changes/` namespace. Understanding | |
| the format of this ref is not required for working with Gerrit, but it | |
| is explained below. | |
| A change ref has the format `refs/changes/X/Y/Z` where `X` is the last | |
| two digits of the change number, `Y` is the entire change number, and `Z` | |
| is the patch set. For example, if the change number is | |
| link:https://gerrit-review.googlesource.com/c/gerrit/+/263270[263270,role=external,window=_blank], | |
| the ref would be `refs/changes/70/263270/2` for the second patch set. | |
| [[fetch-change]] | |
| Using the change ref git clients can fetch the corresponding commit, | |
| e.g. for local verification. | |
| .Fetch Change | |
| ---- | |
| $ git fetch https://gerrithost/myProject refs/changes/74/67374/2 && git checkout FETCH_HEAD | |
| ---- | |
| [NOTE] | |
| The fetch command can be copied from the | |
| link:user-review-ui.html#download[download commands] in the change | |
| screen. | |
| The `refs/for/` prefix is used to map the Gerrit concept of | |
| "Pushing for Review" to the git protocol. For the git client it looks | |
| like every push goes to the same branch, e.g. `refs/for/master` but in | |
| fact for each commit that is pushed to this ref Gerrit creates a new | |
| branch under the `refs/changes/` namespace. In addition Gerrit creates | |
| an open change. | |
| [[change]] | |
| A change consists of a link:user-changeid.html[Change-Id], meta data | |
| (owner, project, target branch etc.), one or more patch sets, comments | |
| and votes. A patch set is a git commit. Each patch set in a change | |
| represents a new version of the change and replaces the previous patch | |
| set. Only the latest patch set is relevant. This means all failed | |
| iterations of a change will never be applied to the target branch, but | |
| only the last patch set that is approved is integrated. | |
| [[change-id]] | |
| The Change-Id is important for Gerrit to know whether a commit that is | |
| pushed for code review should create a new change or whether it should | |
| create a new patch set for an existing change. | |
| The Change-Id is a SHA-1 that is prefixed with an uppercase `I`. It is | |
| specified as footer in the commit message (last paragraph): | |
| ---- | |
| Improve foo widget by attaching a bar. | |
| We want a bar, because it improves the foo by providing more | |
| wizbangery to the dowhatimeanery. | |
| Bug: #42 | |
| Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b | |
| Signed-off-by: A. U. Thor <author@example.com> | |
| ---- | |
| If a commit that has a Change-Id in its commit message is pushed for | |
| review, Gerrit checks if a change with this Change-Id already exists | |
| for this project and target branch, and if yes, Gerrit creates a new | |
| patch set for this change. If not, a new change with the given | |
| Change-Id is created. | |
| If a commit without Change-Id is pushed for review, Gerrit creates a | |
| new change and generates a Change-Id for it. Since in this case the | |
| Change-Id is not included in the commit message, it must be manually | |
| inserted when a new patch set should be uploaded. Most projects already | |
| link:project-configuration.html#require-change-id[require a Change-Id] | |
| when pushing the very first patch set. This reduces the risk of | |
| accidentally creating a new change instead of uploading a new patch | |
| set. Any push without Change-Id then fails with | |
| link:error-missing-changeid.html[missing Change-Id in commit message | |
| footer]. | |
| Amending and rebasing a commit preserves the Change-Id so that the new | |
| commit automatically becomes a new patch set of the existing change, | |
| when it is pushed for review. | |
| .Push new Patch Set | |
| ---- | |
| $ git commit --amend | |
| $ git push origin HEAD:refs/for/master | |
| ---- | |
| Change-Ids are unique for a branch of a project. E.g. commits that fix | |
| the same issue in different branches should have the same Change-Id, | |
| which happens automatically if a commit is cherry-picked to another | |
| branch. This way you can link:user-search.html[search] by the Change-Id | |
| in the Gerrit web UI to find a fix in all branches. | |
| Change-Ids can be created automatically by installing the `commit-msg` | |
| hook as described in the link:user-changeid.html#creation[Change-Id | |
| documentation]. | |
| Instead of manually installing the `commit-msg` hook for each git | |
| repository, you can copy it into the | |
| link:http://git-scm.com/docs/git-init#_template_directory[git template | |
| directory,role=external,window=_blank]. Then it is automatically copied to every newly cloned | |
| repository. | |
| [[review-change]] | |
| == Review Change | |
| After link:#upload-change[uploading a change for review] reviewers can | |
| inspect it via the Gerrit web UI. Reviewers can see the code delta and | |
| link:user-review-ui.html#inline-comments[comment directly in the code] | |
| on code blocks or lines. They can also link:user-review-ui.html#reply[ | |
| post summary comments and vote on review labels]. The | |
| link:user-review-ui.html[documentation of the review UI] explains the | |
| screens and controls for doing code reviews. | |
| There are several options to control how patch diffs should be | |
| rendered. Users can configure their preferences in the | |
| link:user-review-ui.html#diff-preferences[diff preferences]. | |
| [[upload-patch-set]] | |
| == Upload a new Patch Set | |
| If there is feedback from code review and a change should be improved a | |
| new patch set with the reworked code should be uploaded. | |
| This is done by amending the commit of the last patch set. If needed | |
| this commit can be fetched from Gerrit by using the fetch command from | |
| the link:user-review-ui.html#download[download commands] in the change | |
| screen. | |
| It is important that the commit message contains the | |
| link:user-changeid.html[Change-Id] of the change that should be updated | |
| as a footer (last paragraph). Normally the commit message already | |
| contains the correct Change-Id and the Change-Id is preserved when the | |
| commit is amended. | |
| .Push Patch Set | |
| ---- | |
| // fetch and checkout the change | |
| // (checkout command copied from change screen) | |
| $ git fetch https://gerrithost/myProject refs/changes/74/67374/2 && git checkout FETCH_HEAD | |
| // rework the change | |
| $ git add <path-of-reworked-file> | |
| ... | |
| // amend commit | |
| $ git commit --amend | |
| // push patch set | |
| $ git push origin HEAD:refs/for/master | |
| ---- | |
| [NOTE] | |
| Never amend a commit that is already part of a central branch. | |
| Pushing a new patch set triggers email notification to the reviewers. | |
| [[multiple-features]] | |
| == Developing multiple Features in parallel | |
| Code review takes time, which can be used by the change author to | |
| implement other features. Each feature should be implemented in its own | |
| local feature branch that is based on the current HEAD of the target | |
| branch. This way there is no dependency to open changes and new | |
| features can be reviewed and applied independently. If wanted, it is | |
| also possible to base a new feature on an open change. This will create | |
| a dependency between the changes in Gerrit and each change can only be | |
| applied if all its predecessor are applied as well. Dependencies | |
| between changes can be seen from the | |
| link:user-review-ui.html#related-changes[Related Changes] tab on | |
| the change screen. | |
| [[watch]] | |
| == Watching Projects | |
| To get to know about new changes you can link:user-notify.html#user[ | |
| watch the projects] that you are interested in. For watched projects | |
| Gerrit sends you email notifications when a change is uploaded or | |
| modified. You can decide on which events you want to be notified and | |
| you can filter the notifications by using link:user-search.html[change | |
| search expressions]. For example '+branch:master file:^.*\.txt$+' would | |
| send you email notifications only for changes in the master branch that | |
| touch a 'txt' file. | |
| It is common that the members of a project team watch their own | |
| projects and then pick the changes that are interesting to them for | |
| review. | |
| Project owners may also configure | |
| link:intro-project-owner.html#notifications[notifications on | |
| project-level]. | |
| [[adding-reviewers]] | |
| == Adding Reviewers | |
| In the link:user-review-ui.html#reviewers[change screen] reviewers can | |
| be added explicitly to a change. The added reviewer will then be | |
| notified by email about the review request. | |
| Mainly this functionality is used to request the review of specific | |
| person who is known to be an expert in the modified code or who is a | |
| stakeholder of the implemented feature. Normally it is not needed to | |
| explicitly add reviewers on every change, but you rather rely on the | |
| project team to watch their project and to process the incoming changes | |
| by importance, interest, time etc. | |
| There are also link:intro-project-owner.html#reviewers[plugins which | |
| can add reviewers automatically] (e.g. by configuration or based on git | |
| blame annotations). If this functionality is required it should be | |
| discussed with the project owners and the Gerrit administrators. | |
| [[dashboards]] | |
| == Dashboards | |
| Gerrit supports a wide range of link:user-search.html#search-operators[ | |
| query operators] to search for changes by different criteria, e.g. by | |
| status, change owner, votes etc. | |
| The page that shows the results of a change query has the change query | |
| contained in its URL. This means you can bookmark this URL in your | |
| browser to save the change query. This way it can be easily re-executed | |
| later. | |
| Several change queries can be also combined into a dashboard. A | |
| dashboard is a screen in Gerrit that presents the results of several | |
| change queries in different sections, each section having a descriptive | |
| title. | |
| A default dashboard is available under `My` > `Changes`. It has | |
| sections to list outgoing reviews, incoming reviews and recently closed | |
| changes. | |
| Users can also define link:user-dashboards.html#custom-dashboards[ | |
| custom dashboards]. Dashboards can be bookmarked in a browser so that | |
| they can be re-executed later. | |
| It is also possible to link:#my-menu[customize the My menu] and add | |
| menu entries for custom queries or dashboards to it. | |
| Dashboards are very useful to define own views on changes, e.g. you can | |
| have different dashboards for own contributions, for doing reviews or | |
| for different sets of projects. | |
| [NOTE] | |
| You can use the link:user-search.html#limit[limit] and | |
| link:user-search.html#age[age] query operators to limit the result set | |
| in a dashboard section. Clicking on the section title executes the | |
| change query without the `limit` and `age` operator so that you can | |
| inspect the full result set. | |
| Project owners can also define shared | |
| link:user-dashboards.html#project-dashboards[dashboards on | |
| project-level]. The project dashboards can be seen in the web UI under | |
| `Projects` > `List` > <project-name> > `Dashboards`. | |
| All dashboards and search pages allow an action to be applied to multiple | |
| changes at once. Select the changes with the checkboxes on the left side and | |
| choose the action from the action bar at the top of the change section. | |
| [[submit]] | |
| == Submit a Change | |
| Submitting a change means that the code modifications of the current | |
| patch set are applied to the target branch. Submit requires the | |
| link:access-control.html#category_submit[Submit] access right and is | |
| done on the change screen by clicking on the | |
| link:user-review-ui.html#submit[Submit] button. | |
| In order to be submittable changes must first be approved by | |
| link:user-review-ui.html#vote[voting on the review labels]. By default | |
| a change can only be submitted if it has a vote with the highest value | |
| on each review label and no vote with the lowest value (veto vote). | |
| Projects can configure link:intro-project-owner.html#labels[custom | |
| labels] and link:intro-project-owner.html#submit-rules[custom submit | |
| rules] to control when a change becomes submittable. | |
| How the code modification is applied to the target branch when a change | |
| is submitted is controlled by the | |
| link:config-project-config.html#submit-type[submit type] which can be | |
| link:intro-project-owner.html#submit-type[configured on project-level]. | |
| Submitting a change may fail with conflicts. In this case you need to | |
| link:#rebase[rebase] the change locally, resolve the conflicts and | |
| upload the commit with the conflict resolution as new patch set. | |
| If a change cannot be merged due to path conflicts this is highlighted | |
| on the change screen by a bold red `Cannot Merge` label. | |
| [[rebase]] | |
| == Rebase a Change | |
| While a change is in review the HEAD of the target branch can evolve. | |
| In this case the change can be rebased onto the new HEAD of the target | |
| branch. When there are no conflicts the rebase can be done directly | |
| from the link:user-review-ui.html#rebase[change screen], otherwise it | |
| must be done locally. | |
| .Rebase a Change locally | |
| ---- | |
| // update the remote tracking branches | |
| $ git fetch | |
| // fetch and checkout the change | |
| // (checkout command copied from change screen) | |
| $ git fetch https://gerrithost/myProject refs/changes/74/67374/2 && git checkout FETCH_HEAD | |
| // do the rebase | |
| $ git rebase origin/master | |
| // resolve conflicts if needed and stage the conflict resolution | |
| ... | |
| $ git add <path-of-file-with-conflicts-resolved> | |
| // continue the rebase | |
| $ git rebase --continue | |
| // push the commit with the conflict resolution as new patch set | |
| $ git push origin HEAD:refs/for/master | |
| ---- | |
| Doing a manual rebase is only necessary when there are conflicts that | |
| cannot be resolved by Gerrit. If manual conflict resolution is needed | |
| also depends on the link:intro-project-owner.html#submit-type[submit | |
| type] that is configured for the project. | |
| Generally changes shouldn't be rebased without reason as it | |
| increases the number of patch sets and creates noise with | |
| notifications. However if a change is in review for a long time it may | |
| make sense to rebase it from time to time, so that reviewers can see | |
| the delta against the current HEAD of the target branch. It also shows | |
| that there is still an interest in this change. | |
| [NOTE] | |
| Never rebase commits that are already part of a central branch. | |
| [[move]] | |
| == Move a Change | |
| Changes can be link:rest-api-changes.html#move-change[moved] to a desired | |
| destination branch in the same project. This is useful in cases where | |
| development activity switches from one branch to another and there is a | |
| need to move open changes on the inactive branch to the new active one. | |
| Another useful case is to move changes from a newer branch back to an older | |
| bugfix branch where an issue first appeared. | |
| Users can move a change only if they have link:access-control.html#category_abandon[ | |
| abandon permission] on the change and link:access-control.html#category_push[ | |
| push permission] on the destination branch. | |
| The move operation will not update the change's parent and users will have | |
| to link:#rebase[rebase] the change. | |
| [[abandon]] | |
| [[restore]] | |
| == Abandon/Restore a Change | |
| Sometimes during code review a change is found to be bad and it should | |
| be given up. In this case the change can be | |
| link:user-review-ui.html#abandon[abandoned] so that it doesn't appear | |
| in list of open changes anymore. | |
| Abandoned changes can be link:user-review-ui.html#restore[restored] if | |
| later they are needed again. | |
| [[cherrypickof]] | |
| == Cherry-Pick changes of a Change | |
| When a change is created/updated using the 'cherry-pick' functionality, | |
| the original change and patchset details are recorded in the Change's | |
| cherrypick field. This field cannot be set or updated by the user in | |
| any way. It is set automatically after the cherry-pick operation completes | |
| successfully. | |
| [[topics]] | |
| == Using Topics | |
| Changes can be grouped by topics. This is useful because it allows you | |
| to easily find related changes by using the | |
| link:user-search.html#topic[topic search operator]. Also on the change | |
| screen link:user-review-ui.html#same-topic[changes with the same topic] | |
| are displayed so that you can easily navigate between them. | |
| Often changes that together implement a feature or a user story are | |
| group by a topic. | |
| Assigning a topic to a change can be done in the | |
| link:user-review-ui.html#project-branch-topic[change screen]. | |
| It is also possible to link:user-upload.html#topic[set a topic on | |
| push], either by appending `%topic=...` to the ref name or through | |
| the use of the command line flag `--push-option`, aliased to `-o`, | |
| followed by `topic=...`. | |
| Gerrit may be link:config-gerrit.html#change.submitWholeTopic[configured] to | |
| submit all changes in a topic together with a single click, even when topics | |
| span multiple projects. | |
| .Set Topic on Push | |
| ---- | |
| $ git push origin HEAD:refs/for/master%topic=multi-master | |
| // this is the same as: | |
| $ git push origin HEAD:refs/heads/master -o topic=multi-master | |
| ---- | |
| For more information about using topics, see the user guide: | |
| link:cross-repository-changes.html[Submitting Changes Across Repositories by using Topics]. | |
| [[hashtags]] | |
| == Using Hashtags | |
| Hashtags are freeform strings associated with a change, like on social media | |
| platforms. In Gerrit, you explicitly associate hashtags with changes using a | |
| dedicated area of the UI; they are not parsed from commit messages or comments. | |
| Similar to topics, hashtags can be used to group related changes together, and | |
| to search using the link:user-search.html#hashtag[`hashtag:`] operator. Unlike | |
| topics, a change can have multiple hashtags, and they are only used for | |
| informational grouping; changes with the same hashtags are not necessarily | |
| submitted together. | |
| .Set Hashtag on Push | |
| ---- | |
| $ git push origin HEAD:refs/for/master%t=stable-bugfix | |
| // this is the same as: | |
| $ git push origin HEAD:refs/heads/master -o t=stable-bugfix | |
| ---- | |
| [[wip]] | |
| == Work-in-Progress Changes | |
| Work-in-Progress (WIP) changes are visible to anyone, but do not notify or | |
| require an action from a reviewer. | |
| Specifically, when you mark a change as Work-in-Progress: | |
| * Reviewers are not notified for most operations, such as adding or removing, | |
| posting comments, and so on. See the REST API documentation | |
| link:rest-api-changes.html#set-review-notifications[tables] for more | |
| information. | |
| * The change does not show in reviewers' dashboards. | |
| WIP changes are useful when: | |
| * You have implemented only part of a change, but want to push your change | |
| to the server to run tests or perform other actions before requesting | |
| reviewer feedback. | |
| * During a review, you realize you need to rework your change, and you | |
| want to stop notifying reviewers of the change until you finish your | |
| update. | |
| To set the status of a change to Work-in-Progress, you can use either | |
| the command line or the user interface. To use the command line, append | |
| `%wip` to your push request. | |
| ---- | |
| $ git push origin HEAD:refs/for/master%wip | |
| ---- | |
| Alternatively, click *WIP* from the *More* menu on the Change screen. | |
| The Change screen updates with a yellow header, indicating that | |
| the change is in a Work-in-Progress state. | |
| To mark the change as ready for review, append `%ready` to your push | |
| request. | |
| ---- | |
| $ git push origin HEAD:refs/for/master%ready | |
| ---- | |
| There are two options for marking the change ready for review from the Change | |
| screen: | |
| 1. Click *Start Review* (the primary action *Reply* is renamed when in WIP | |
| state). | |
| + | |
| This will open the reply-modal and allow you to add reviewers and/or CC | |
| before you start review. | |
| 2. Click button *Mark As Active*. | |
| + | |
| This will only change the state from WIP to ready, without opening the | |
| reply-modal. | |
| Change owners, project owners, site administrators and members of a group that | |
| was granted link:access-control.html#category_toggle_work_in_progress_state[ | |
| Toggle Work In Progress state] permission can mark changes as `work-in-progress` | |
| and `ready`. | |
| [[private-changes]] | |
| == Private Changes | |
| Private changes are changes that are only visible to their owners, reviewers | |
| and users with the link:access-control.html#category_view_private_changes[ | |
| View Private Changes] global capability. Private changes are useful in a number | |
| of cases: | |
| * You want a set of collaborators to review the change before formal review | |
| starts. By creating a Private change and adding only a selected few as | |
| reviewers you can control who can see the change and get a first opinion | |
| before opening up for all reviewers. | |
| * You want to check what the change looks like before formal review starts. | |
| By marking the change private without reviewers, nobody can | |
| prematurely comment on your changes. | |
| * You want to use Gerrit to sync data between different devices. By | |
| creating a private throwaway change without reviewers, you can push | |
| from one device, and fetch to another device. | |
| Do *not* use private changes for making security fixes (see | |
| link:#private-changes-pitfalls[pitfalls] below). How to make security | |
| fixes is explained link:#security-fixes[below]. | |
| To create a private change, you push it with the `private` option. | |
| .Push a private change | |
| ---- | |
| $ git commit | |
| $ git push origin HEAD:refs/for/master%private | |
| ---- | |
| The change will remain private on subsequent pushes until you specify | |
| the `remove-private` option. Alternatively, the web UI provides buttons | |
| to mark a change private and non-private again. | |
| When pushing a private change with a commit that is authored by another | |
| user, the other user will not be automatically added as a reviewer and | |
| must be explicitly added. | |
| For CI systems that must verify private changes, a special permission | |
| can be granted | |
| (link:access-control.html#category_view_private_changes[View Private Changes]). | |
| In that case, care should be taken to prevent the CI system from | |
| exposing secret details. | |
| [[private-changes-pitfalls]] | |
| === Pitfalls | |
| If private changes are used, be aware of the following pitfalls: | |
| * If a private change gets merged the corresponding commit gets visible | |
| for all users that can access the target branch and the private flag | |
| from the change is automatically removed. This makes private changes | |
| a bad choice for security fixes, as the security fix will be | |
| accessible as soon as the change was merged, but for security issues | |
| you want to keep an embargo until new releases have been made | |
| available. | |
| * If you push a non-private change on top of a private change the | |
| commit of the private change gets implicitly visible through the | |
| parent relationship of the follow-up change. | |
| * If you have a series of private changes and share one with reviewers, | |
| the reviewers can also see the commits of the predecessor private | |
| changes through the commit parent relationship. | |
| * Users who would have permission to access the change except for its | |
| private status and knowledge of its commit ID (e.g. through CI logs | |
| or build artifacts containing build numbers) can fetch the code | |
| using the commit ID. | |
| * Refs that store private changes are visible to users that have the | |
| link:access-control.html#category_read[Read] access right on | |
| 'refs/*', unless | |
| link:config-gerrit.html#auth.skipFullRefEvaluationIfAllRefsAreVisible[auth.skipFullRefEvaluationIfAllRefsAreVisible] | |
| is disabled. | |
| [[inline-edit]] | |
| == Inline Edit | |
| It is possible to link:user-inline-edit.html#editing-change[edit | |
| changes inline] directly in the web UI. This is useful to make small | |
| corrections immediately and publish them as a new patch set. | |
| It is also possible to link:user-inline-edit.html#create-change[create | |
| new changes inline]. | |
| [[roles]] | |
| == Roles | |
| Making and reviewing changes usually involves multiple users that | |
| assume different roles: | |
| - Author: | |
| + | |
| The person who wrote the code change. Recorded as author in the Git | |
| commit. | |
| - Committer: | |
| + | |
| The person who created the Git commit, e.g. the person that executed | |
| the `git commit` command. Recorded as committer in the Git commit. | |
| - Uploader: | |
| + | |
| The user that uploaded the commit as a patch set to Gerrit, e.g. the | |
| user that executed the `git push` command. For commits that are created through | |
| an action in the web UI the uploader is the user that triggered the action (e.g. | |
| if a commit is created by clicking on the `REBASE` button, the user clicking on | |
| the button becomes the uploader of the newly created commit). | |
| + | |
| The uploader of the first patch set is the change owner. | |
| + | |
| The uploader of the latest patch set, the user that uploaded the | |
| current patch set, is relevant when | |
| link:config-labels.html#label_ignoreSelfApproval[self approvals on labels are | |
| ignored], as in this case approvals from the uploader of the latest patch set | |
| are ignored. | |
| - Change Owner: | |
| + | |
| The user that created the change, e.g. uploaded the first patch set. | |
| - Reviewer: | |
| + | |
| A user that has reviewed the change or has been asked to review the change. | |
| Often one user assumes several of these roles, but it's possible that each role | |
| is assumed by a different user. | |
| [[project-administration]] | |
| == Project Administration | |
| Every project has a link:intro-project-owner.html#project-owner[project | |
| owner] that administrates the project. Project administration includes | |
| the configuration of the project | |
| link:intro-project-owner.html#access-rights[access rights], but project | |
| owners have many more possibilities to customize the workflows for a | |
| project which are described in the link:intro-project-owner.html[ | |
| project owner guide]. | |
| [[no-code-review]] | |
| == Working without Code Review | |
| Doing code reviews with Gerrit is optional and you can use Gerrit | |
| without code review as a pure Git server. | |
| .Push with bypassing Code Review | |
| ---- | |
| $ git commit | |
| $ git push origin HEAD:master | |
| // this is the same as: | |
| $ git commit | |
| $ git push origin HEAD:refs/heads/master | |
| ---- | |
| [NOTE] | |
| Bypassing code review must be enabled in the project access rights. The | |
| project owner must allow it by assigning the | |
| link:access-control.html#category_push_direct[Push] access right on the | |
| target branch (`refs/heads/<branch-name>`). | |
| [NOTE] | |
| If you bypass code review you always need to merge/rebase manually if | |
| the tip of the destination branch has moved. Please keep this in mind | |
| if you choose to not work with code review because you think it's | |
| easier to avoid the additional complexity of the review workflow; it | |
| might actually not be easier. | |
| [NOTE] | |
| The project owner may enable link:user-upload.html#auto_merge[ | |
| auto-merge on push] to benefit from the automatic merge/rebase on | |
| server side while pushing directly into the repository. | |
| [[user-refs]] | |
| == User Refs | |
| User configuration data such as link:#preferences[preferences] is | |
| stored in the `All-Users` project under a per-user ref. The user's | |
| ref is based on the user's account id which is an integer. The user | |
| refs are sharded by the last two digits (`+nn+`) in the refname, | |
| leading to refs of the format `+refs/users/nn/accountid+`. | |
| [[preferences]] | |
| == Preferences | |
| There are several options to control the rendering in the Gerrit web UI. | |
| Users can configure their preferences under `Settings` > `Preferences`. | |
| The user's preferences are stored in a `git config` style file named | |
| `preferences.config` under the link:#user-refs[user's ref] in the | |
| `All-Users` project. | |
| The following preferences can be configured: | |
| - [[page-size]]`Maximum Page Size`: | |
| + | |
| The maximum number of entries that are shown on one page, e.g. used | |
| when paging through changes, projects, branches or groups. | |
| - [[date-time-format]]`Date/Time Format`: | |
| + | |
| The format that should be used to render dates and timestamps. | |
| - [[email-notifications]]`Email Notifications`: | |
| + | |
| This setting controls the email notifications. | |
| + | |
| ** [[cc-me]]`Every comment`: | |
| + | |
| Email notifications are enabled and you get notified by email as CC | |
| on comments that you write yourself. | |
| + | |
| ** `Only comments left by others` | |
| + | |
| Email notifications are enabled for all activities excluding comments or | |
| reviews authored by you. | |
| + | |
| ** `Only when I am in the attention set` | |
| + | |
| Email notifications are only sent if the recipient is in the attention set. | |
| + | |
| ** `None`: | |
| + | |
| Email notifications are disabled. | |
| - [[email-format]]`Email Format`: | |
| + | |
| This setting controls the email format Gerrit sends. Note that this | |
| setting has no effect if the administrator has disabled HTML emails | |
| for the Gerrit instance. | |
| + | |
| ** `Plaintext Only`: | |
| + | |
| Email notifications contain only plaintext content. | |
| + | |
| ** `HTML and Plaintext`: | |
| + | |
| Email notifications contain both HTML and plaintext content. | |
| - [[default-base-for-merges]]`Default Base For Merges`: | |
| + | |
| This setting controls which base should be pre-selected in the | |
| `Diff Against` drop-down list when the change screen is opened for a | |
| merge commit. | |
| + | |
| ** `Auto Merge`: | |
| + | |
| Pre-selects `Auto Merge` in the `Diff Against` drop-down list when the | |
| change screen is opened for a merge commit. | |
| + | |
| ** `First Parent`: | |
| + | |
| Pre-selects `Parent 1` in the `Diff Against` drop-down list when the | |
| change screen is opened for a merge commit. | |
| + | |
| - [[diff-view]]`Diff View`: | |
| + | |
| Whether the Side-by-Side diff view or the Unified diff view should be | |
| shown when clicking on a file path in the change screen. | |
| - [[show-site-header]]`Show Site Header / Footer`: | |
| + | |
| Whether the site header and footer should be shown. | |
| - [[relative-dates]]`Show Relative Dates In Changes Table`: | |
| + | |
| Whether timestamps in change lists and dashboards should be shown as | |
| relative timestamps, e.g. '12 days ago' instead of absolute timestamps | |
| such as 'Apr 15'. | |
| - [[change-size-bars]]`Show Change Sizes As Colored Bars`: | |
| + | |
| Whether change sizes should be visualized as colored bars. If disabled | |
| the numbers of added and deleted lines are shown as text, e.g. | |
| '+297, -63'. | |
| - [[show-change-number]]`Show Change Number In Changes Table`: | |
| + | |
| Whether in change lists and dashboards an `ID` column with the change numbers | |
| should be shown. | |
| - [[mute-common-path-prefixes]]`Mute Common Path Prefixes In File List`: | |
| + | |
| Whether common path prefixes in the file list on the change screen | |
| should be link:user-review-ui.html#repeating-path-segments[grayed out]. | |
| - [[inline-signed-off]]`Insert Signed-off-by Footer For Inline Edit Changes`: | |
| + | |
| Whether a `Signed-off-by` footer should be automatically inserted into | |
| changes that are created from the web UI (e.g. by the `Create Change` | |
| and `Edit Config` buttons on the project screen, and the `Follow-Up` | |
| button on the change screen). | |
| - [[publish-comments-on-push]]`Publish comments on push`: | |
| + | |
| Whether to publish any outstanding draft comments by default when pushing | |
| updates to open changes. This preference just sets the default; the behavior can | |
| still be overridden using a link:user-upload.html#publish-comments[push option]. | |
| - [[use-flash]]`Use Flash Clipboard Widget`: | |
| + | |
| Whether the Flash clipboard widget should be used. If enabled and the Flash | |
| plugin is available, Gerrit offers a copy-to-clipboard icon next to IDs and | |
| commands that need to be copied frequently, such as the Change-Ids, commit IDs | |
| and download commands. Note that this option is only shown if the Flash plugin | |
| is available and the JavaScript Clipboard API is unavailable. | |
| - [[work-in-progress-by-default]]`Set new changes work-in-progress`: | |
| + | |
| Whether new changes are uploaded as work-in-progress per default. This | |
| preference just sets the default; the behavior can still be overridden using a | |
| link:user-upload.html#wip[push option]. | |
| [[my-menu]] | |
| In addition it is possible to customize the menu entries of the `My` | |
| menu. This can be used to make the navigation to frequently used | |
| screens, e.g. configured link:#dashboards[dashboards], quick. | |
| [[reply-by-email]] | |
| == Reply by Email | |
| Gerrit sends out email notifications to users and supports parsing back replies | |
| on some of them (when link:config-gerrit.html#receiveemail[configured]). | |
| Gerrit supports replies on these notification emails: | |
| * Notifications about new comments | |
| * Notifications about new labels that were applied or removed | |
| While Gerrit supports a wide range of email clients, the following ones have | |
| been tested and are known to work: | |
| * Gmail | |
| * Gmail Mobile | |
| Gerrit supports parsing back all comment types that can be applied to a change | |
| via the WebUI: | |
| * Change messages | |
| * Inline comments | |
| * File comments | |
| Please note that comments can only be sent in reply to a comment in the original | |
| notification email, while the change message is independent of those. | |
| Gerrit supports parsing a user's reply from both HTML and plaintext. Please note | |
| that some email clients extract the text from the HTML email they have received | |
| and send this back as a quoted reply if you have set the client to plaintext | |
| mode. In this case, Gerrit only supports parsing a change message. To work | |
| around this issue, consider setting a <<email-format,User Preference>> to | |
| receive only plaintext emails. | |
| Example notification: | |
| ---- | |
| Some User has posted comments on this change. | |
| (https://gerrit-review.googlesource.com/123123 ) | |
| Change subject: My new change | |
| ...................................................................... | |
| Patch Set 3: | |
| Just a couple of smaller things I found. | |
| https://gerrit-review.googlesource.com/#/c/123123/3/MyFile.java | |
| File | |
| MyFile.java: | |
| https://gerrit-review.googlesource.com/#/c/123123/3/MyFile@420 | |
| PS3, Line 420: someMethodCall(param); | |
| Seems to be failing the tests. | |
| -- | |
| To view, visit https://gerrit-review.googlesource.com/123123 | |
| To unsubscribe, visit https://gerrit-review.googlesource.com/settings | |
| (Footers omitted for brevity, must be included in all emails) | |
| ---- | |
| Example response from the user: | |
| ---- | |
| Thanks, I'll fix it. | |
| > Some User has posted comments on this change. | |
| > (https://gerrit-review.googlesource.com/123123 ) | |
| > | |
| > Change subject: My new change | |
| > ...................................................................... | |
| > | |
| > | |
| > Patch Set 3: | |
| > | |
| > Just a couple of smaller things I found. | |
| > | |
| > https://gerrit-review.googlesource.com/#/c/123123/3/MyFile.java | |
| > File | |
| > MyFile.java: | |
| Rename this file to File.java | |
| > | |
| > https://gerrit-review.googlesource.com/#/c/123123/3/MyFile@420 | |
| > PS3, Line 420: someMethodCall(param); | |
| > Seems to be failing the tests. | |
| > | |
| Yeah, I see why, let me try again. | |
| > | |
| > -- | |
| > To view, visit https://gerrit-review.googlesource.com/123123 | |
| > To unsubscribe, visit https://gerrit-review.googlesource.com/settings | |
| > | |
| > (Footers omitted for brevity, must be included in all emails) | |
| ---- | |
| In this case, Gerrit will persist a change message ("Thanks, I'll fix it."), | |
| a file comment ("Rename this file to File.java") as well as a reply to an | |
| inline comment ("Yeah, I see why, let me try again."). | |
| [[security-fixes]] | |
| == Security Fixes | |
| If a security vulnerability is discovered you normally want to have an | |
| embargo about it until fixed releases have been made available. This | |
| means you want to develop and review security fixes in private. | |
| If your repository is public or grants broad read access it is | |
| recommended to fix security issues in a copy of your repository which | |
| has very restricted read permissions (e.g. `myproject-security-fixes`). | |
| You can then implement, review and submit the security fix in this | |
| repository, make and publish a new release and only then integrate the | |
| security fix back into the normal (public) repository. | |
| Alternatively you can do the security fix in your normal repository in | |
| a branch with restricted read permissions. We don't recommend this | |
| because there is a risk of configuring the access rights wrongly and | |
| unintentionally granting read access to the wrong people. | |
| Using private changes for security fixes is *not* recommended due to | |
| the link:#private-changes-pitfalls[pitfalls] discussed above. | |
| Especially you don't want the fix to become visible after submit and | |
| before you had a chance to make and publish a new release. | |
| GERRIT | |
| ------ | |
| Part of link:index.html[Gerrit Code Review] | |
| SEARCHBOX | |
| --------- |