| = Gerrit Code Review - Change-Ids |
| |
| == Description |
| |
| Gerrit needs to identify commits that belong to the same review. For |
| instance, when a change needs to be modified, a second commit can be uploaded |
| to address the reported issues. Gerrit allows attaching those 2 commits |
| to the same change, and relies upon a Change-Id line at the bottom of a |
| commit message to do so. With this Change-Id, Gerrit can automatically |
| associate a new version of a change back to its original review, even |
| across cherry-picks and rebases. |
| |
| To be picked up by Gerrit, a Change-Id line must be in the footer |
| (last paragraph) of a commit message, and may be mixed |
| together with link:user-signedoffby.html[Signed-off-by], Acked-by, |
| or other such lines. For example: |
| |
| ---- |
| $ git log -1 |
| commit 29a6bb1a059aef021ac39d342499191278518d1d |
| Author: A. U. Thor <author@example.com> |
| Date: Thu Aug 20 12:46:50 2009 -0700 |
| |
| 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> |
| CC: R. E. Viewer <reviewer@example.com> |
| ---- |
| |
| In the above example, `Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b` |
| is the identity assigned to this change. It is independent of the |
| commit id. To avoid confusion with commit ids, Change-Ids are typically |
| prefixed with an uppercase `I`. |
| |
| Note that a Change-Id is not necessarily unique within a Gerrit instance. It can |
| be reused among different repositories or branches (see below, |
| link:user-changeid.html#change-upload[change-upload]). |
| |
| [[creation]] |
| == Creation |
| |
| Change-Ids are created at commit time on the client side. |
| A standard 'commit-msg' hook is provided by Gerrit, and |
| can be installed in the local Git repository to automatically |
| generate and insert a Change-Id line during `git commit`, when |
| none is defined yet. |
| |
| To install the hook, copy it from Gerrit's daemon by executing |
| one of the following commands while being in the root directory |
| of the local Git repository: |
| |
| $ curl -Lo .git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg |
| |
| or: |
| |
| $ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg .git/hooks/ |
| |
| Then ensure that the execute bit is set on the hook script: |
| |
| $ chmod u+x .git/hooks/commit-msg |
| |
| For more details, see link:cmd-hook-commit-msg.html[commit-msg]. |
| |
| [[change-upload]] |
| Change Upload |
| -------------- |
| |
| During upload by pushing to `+refs/for/*+` or `+refs/heads/*+`, |
| Gerrit will try to find an existing review the uploaded commit |
| relates to. For an existing review to match, the following properties |
| have to match: |
| |
| * Change-Id |
| * Repository name |
| * Branch name |
| |
| The following applies in the different scenarios: |
| |
| * Create a new change |
| + |
| If no matching review is found, Gerrit will create a new change for review. |
| |
| * Update an existing change |
| + |
| If a matching review is found, Gerrit will add the new commit as a new patch |
| set on the existing change. |
| |
| * Close an existing change |
| + |
| If a matching review is found, and the commit is being |
| pushed directly to refs/heads/*, the existing change is updated with |
| the new commit, and the change is closed and marked as merged. |
| |
| If a Change-Id line is not present in the commit message, Gerrit will |
| automatically generate its own Change-Id and display it on the web. |
| This line can be manually copied and inserted into an updated commit |
| message if additional revisions to a change are required. |
| |
| By default, Gerrit will prevent pushing for review if no Change-Id is provided, |
| with the following message: |
| |
| ! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit |
| message footer) |
| |
| However, repositories can be configured to allow commits without Change-Ids |
| in the commit message by setting "Require Change-Id in commit message" to "FALSE". |
| |
| For more details on using git push to upload changes to Gerrit, |
| see link:user-upload.html#push_create[creating changes by git push]. |
| |
| == Git Tasks |
| |
| [[new]] |
| === Creating a new commit |
| |
| When creating a new commit, ensure the 'commit-msg' hook has been |
| installed in your repository (see above), and don't put a Change-Id |
| line in the commit message. When you exit the editor, git will call |
| the hook, which will automatically generate and insert a unique |
| Change-Id line. You can inspect the modified message after the |
| commit is complete by executing `git show`. |
| |
| [[amend]] |
| === Amending a commit |
| |
| When amending a commit with `git commit --amend`, leave the |
| Change-Id line unmodified in the commit message. This will allow |
| Gerrit to automatically update the change with the amended commit. |
| |
| [[rebase]] |
| === Rebasing a commit |
| |
| When rebasing a commit, leave the Change-Id line unmodified in the |
| commit message. This will allow Gerrit to automatically update |
| the change with the rebased commit. |
| |
| [[squash]] |
| === Squashing commits |
| |
| When squashing several commits together, try to preserve only one |
| Change-Id line, and remove the others from the commit message. |
| When faced with multiple lines, try to preserve a line which was |
| already uploaded to Gerrit Code Review, and thus has a corresponding |
| change that reviewers have already examined and left comments on. |
| If you aren't sure which lines Gerrit knows about, try copying and |
| pasting the lines into the search box at the top-right of the web interface. |
| |
| If Gerrit already knows about more than one Change-Id, pick one |
| to keep in the squashed commit message, and manually abandon the |
| other changes through the web interface. |
| |
| [[cherry-pick]] |
| === Cherry-picking a commit |
| |
| When cherry-picking a commit, leave the Change-Id line alone to |
| have Gerrit treat the cherry-picked commit as a replacement for |
| the existing change. This can be very useful if the project has |
| a fast-forward-only merge policy, and the submitter is downloading |
| and cherry-picking individual changes prior to submission, such as |
| by link:cmd-cherry-pick.html[gerrit-cherry-pick]. |
| |
| Or, you may wish to delete the Change-Id line and force a new |
| Change-Id to be generated automatically, thus creating an entirely |
| new change record for review. This may be useful when backporting |
| a change from the current development branch to a maintenance |
| release branch. |
| |
| [[update-old]] |
| === Updating an old commit |
| |
| If a commit was created before the availability of Change-Id support, |
| or was created in a Git repository that was missing the 'commit-msg' |
| hook, simply copy the "`Change-Id: I...`" line from the first line |
| of the Description section of the change and amend it to the bottom |
| of the commit message. Any subsequent uploads of the commit will |
| be automatically associated with the prior change. |
| |
| GERRIT |
| ------ |
| Part of link:index.html[Gerrit Code Review] |
| |
| SEARCHBOX |
| --------- |