NAME

commit-msg - Edit commit messages to insert a Change-Id tag.

DESCRIPTION

A Git hook automatically invoked by git commit, and most other commit creation tools such as git citool or git gui. The Gerrit Code Review supplied implementation of this hook is a short shell script which automatically inserts a globally unique Change-Id tag in the footer of a commit message. When present, Gerrit uses this tag to track commits across cherry-picks and rebases.

After the hook has been installed in the user’s local Git repository for a project, the hook will modify a commit message such as:

Improve foo widget by attaching a bar.

We want a bar, because it improves the foo by providing more
wizbangery to the dowhatimeanery.

Signed-off-by: A. U. Thor <author@example.com>

by inserting a new `Change-Id: ` line in the footer:

Improve foo widget by attaching a bar.

We want a bar, because it improves the foo by providing more
wizbangery to the dowhatimeanery.

Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
Signed-off-by: A. U. Thor <author@example.com>

The hook implementation is reasonably intelligent at inserting the Change-Id line before any Signed-off-by or Acked-by lines placed at the end of the commit message by the author, but if no such lines are present then it will just insert a blank line, and add the Change-Id at the bottom of the message.

If a Change-Id line is already present in the message footer, the script will do nothing, leaving the existing Change-Id unmodified. This permits amending an existing commit, or allows the user to insert the Change-Id manually after copying it from an existing change viewed on the web.

The Change-Id will not be added if gerrit.createChangeId is set to false in the git config.

The Change-Id will not be added to temporary commits created by git commit --fixup or git commit --squash, as well as commits with a subject line that begins with a lowercase word followed by an exclamation mark (e.g., nopush!). To override this behavior, set gerrit.createChangeId to always in the git config.

If gerrit.reviewUrl is set to the base URL of the Gerrit server that changes are uploaded to (e.g. https://gerrit-review.googlesource.com/) in the git config, then instead of adding a Change-Id trailer, a Link trailer will be inserted that will look like this:

Improve foo widget by attaching a bar.

We want a bar, because it improves the foo by providing more
wizbangery to the dowhatimeanery.

Link: https://gerrit-review.googlesource.com/id/Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
Signed-off-by: A. U. Thor <author@example.com>

This link will become a valid link to the review page once the change is uploaded to the Gerrit server. Newer versions of the Gerrit server will read the change identifier out of the appropriate Link trailer and treat it in the same way as the change identifier in a Change-Id trailer.

OBTAINING

To obtain the commit-msg script use scp, wget or curl to download it to your local system from your Gerrit server.

You can use either of the below commands:

$ scp -p -P 29418 <your username>@<your Gerrit review server>:hooks/commit-msg <local path to your git>/.git/hooks/

$ curl -Lo <local path to your git>/.git/hooks/commit-msg <your Gerrit http URL>/tools/hooks/commit-msg

A specific example of this might look something like this:

$ scp -p -P 29418 john.doe@review.example.com:hooks/commit-msg ~/duhproject/.git/hooks/

$ curl -Lo ~/duhproject/.git/hooks/commit-msg http://review.example.com/tools/hooks/commit-msg

Make sure the hook file is executable:

$ chmod u+x ~/duhproject/.git/hooks/commit-msg

SEE ALSO

IMPLEMENTATION

The hook generates unique Change-Id lines by creating a virtual commit object within the local Git repository, and obtaining the SHA-1 hash from it. Like any other Git commit, the following properties are included in the computation:

  • SHA-1 of the tree being committed

  • SHA-1 of the parent commit

  • Name, email address, timestamp of the author

  • Name, email address, timestamp of the committer

  • Proposed commit message (before Change-Id was inserted)

Because the names of the tree and parent commit, as well as the committer timestamp are included in the hash computation, the output Change-Id is sufficiently unique.