|  | git-interpret-trailers(1) | 
|  | ========================= | 
|  |  | 
|  | NAME | 
|  | ---- | 
|  | git-interpret-trailers - Add or parse structured information in commit messages | 
|  |  | 
|  | SYNOPSIS | 
|  | -------- | 
|  | [verse] | 
|  | 'git interpret-trailers' [<options>] [(--trailer <token>[(=|:)<value>])...] [<file>...] | 
|  | 'git interpret-trailers' [<options>] [--parse] [<file>...] | 
|  |  | 
|  | DESCRIPTION | 
|  | ----------- | 
|  | Help parsing or adding 'trailers' lines, that look similar to RFC 822 e-mail | 
|  | headers, at the end of the otherwise free-form part of a commit | 
|  | message. | 
|  |  | 
|  | This command reads some patches or commit messages from either the | 
|  | <file> arguments or the standard input if no <file> is specified. If | 
|  | `--parse` is specified, the output consists of the parsed trailers. | 
|  |  | 
|  | Otherwise, this command applies the arguments passed using the | 
|  | `--trailer` option, if any, to the commit message part of each input | 
|  | file. The result is emitted on the standard output. | 
|  |  | 
|  | Some configuration variables control the way the `--trailer` arguments | 
|  | are applied to each commit message and the way any existing trailer in | 
|  | the commit message is changed. They also make it possible to | 
|  | automatically add some trailers. | 
|  |  | 
|  | By default, a '<token>=<value>' or '<token>:<value>' argument given | 
|  | using `--trailer` will be appended after the existing trailers only if | 
|  | the last trailer has a different (<token>, <value>) pair (or if there | 
|  | is no existing trailer). The <token> and <value> parts will be trimmed | 
|  | to remove starting and trailing whitespace, and the resulting trimmed | 
|  | <token> and <value> will appear in the message like this: | 
|  |  | 
|  | ------------------------------------------------ | 
|  | token: value | 
|  | ------------------------------------------------ | 
|  |  | 
|  | This means that the trimmed <token> and <value> will be separated by | 
|  | `': '` (one colon followed by one space). | 
|  |  | 
|  | By default the new trailer will appear at the end of all the existing | 
|  | trailers. If there is no existing trailer, the new trailer will appear | 
|  | after the commit message part of the output, and, if there is no line | 
|  | with only spaces at the end of the commit message part, one blank line | 
|  | will be added before the new trailer. | 
|  |  | 
|  | Existing trailers are extracted from the input message by looking for | 
|  | a group of one or more lines that (i) is all trailers, or (ii) contains at | 
|  | least one Git-generated or user-configured trailer and consists of at | 
|  | least 25% trailers. | 
|  | The group must be preceded by one or more empty (or whitespace-only) lines. | 
|  | The group must either be at the end of the message or be the last | 
|  | non-whitespace lines before a line that starts with '---' (followed by a | 
|  | space or the end of the line). Such three minus signs start the patch | 
|  | part of the message. See also `--no-divider` below. | 
|  |  | 
|  | When reading trailers, there can be whitespaces after the | 
|  | token, the separator and the value. There can also be whitespaces | 
|  | inside the token and the value. The value may be split over multiple lines with | 
|  | each subsequent line starting with whitespace, like the "folding" in RFC 822. | 
|  |  | 
|  | Note that 'trailers' do not follow and are not intended to follow many | 
|  | rules for RFC 822 headers. For example they do not follow | 
|  | the encoding rules and probably many other rules. | 
|  |  | 
|  | OPTIONS | 
|  | ------- | 
|  | --in-place:: | 
|  | Edit the files in place. | 
|  |  | 
|  | --trim-empty:: | 
|  | If the <value> part of any trailer contains only whitespace, | 
|  | the whole trailer will be removed from the resulting message. | 
|  | This applies to existing trailers as well as new trailers. | 
|  |  | 
|  | --trailer <token>[(=|:)<value>]:: | 
|  | Specify a (<token>, <value>) pair that should be applied as a | 
|  | trailer to the input messages. See the description of this | 
|  | command. | 
|  |  | 
|  | --where <placement>:: | 
|  | --no-where:: | 
|  | Specify where all new trailers will be added.  A setting | 
|  | provided with '--where' overrides all configuration variables | 
|  | and applies to all '--trailer' options until the next occurrence of | 
|  | '--where' or '--no-where'. Possible values are `after`, `before`, | 
|  | `end` or `start`. | 
|  |  | 
|  | --if-exists <action>:: | 
|  | --no-if-exists:: | 
|  | Specify what action will be performed when there is already at | 
|  | least one trailer with the same <token> in the message.  A setting | 
|  | provided with '--if-exists' overrides all configuration variables | 
|  | and applies to all '--trailer' options until the next occurrence of | 
|  | '--if-exists' or '--no-if-exists'. Possible actions are `addIfDifferent`, | 
|  | `addIfDifferentNeighbor`, `add`, `replace` and `doNothing`. | 
|  |  | 
|  | --if-missing <action>:: | 
|  | --no-if-missing:: | 
|  | Specify what action will be performed when there is no other | 
|  | trailer with the same <token> in the message.  A setting | 
|  | provided with '--if-missing' overrides all configuration variables | 
|  | and applies to all '--trailer' options until the next occurrence of | 
|  | '--if-missing' or '--no-if-missing'. Possible actions are `doNothing` | 
|  | or `add`. | 
|  |  | 
|  | --only-trailers:: | 
|  | Output only the trailers, not any other parts of the input. | 
|  |  | 
|  | --only-input:: | 
|  | Output only trailers that exist in the input; do not add any | 
|  | from the command-line or by following configured `trailer.*` | 
|  | rules. | 
|  |  | 
|  | --unfold:: | 
|  | Remove any whitespace-continuation in trailers, so that each | 
|  | trailer appears on a line by itself with its full content. | 
|  |  | 
|  | --parse:: | 
|  | A convenience alias for `--only-trailers --only-input | 
|  | --unfold`. | 
|  |  | 
|  | --no-divider:: | 
|  | Do not treat `---` as the end of the commit message. Use this | 
|  | when you know your input contains just the commit message itself | 
|  | (and not an email or the output of `git format-patch`). | 
|  |  | 
|  | CONFIGURATION VARIABLES | 
|  | ----------------------- | 
|  |  | 
|  | trailer.separators:: | 
|  | This option tells which characters are recognized as trailer | 
|  | separators. By default only ':' is recognized as a trailer | 
|  | separator, except that '=' is always accepted on the command | 
|  | line for compatibility with other git commands. | 
|  | + | 
|  | The first character given by this option will be the default character | 
|  | used when another separator is not specified in the config for this | 
|  | trailer. | 
|  | + | 
|  | For example, if the value for this option is "%=$", then only lines | 
|  | using the format '<token><sep><value>' with <sep> containing '%', '=' | 
|  | or '$' and then spaces will be considered trailers. And '%' will be | 
|  | the default separator used, so by default trailers will appear like: | 
|  | '<token>% <value>' (one percent sign and one space will appear between | 
|  | the token and the value). | 
|  |  | 
|  | trailer.where:: | 
|  | This option tells where a new trailer will be added. | 
|  | + | 
|  | This can be `end`, which is the default, `start`, `after` or `before`. | 
|  | + | 
|  | If it is `end`, then each new trailer will appear at the end of the | 
|  | existing trailers. | 
|  | + | 
|  | If it is `start`, then each new trailer will appear at the start, | 
|  | instead of the end, of the existing trailers. | 
|  | + | 
|  | If it is `after`, then each new trailer will appear just after the | 
|  | last trailer with the same <token>. | 
|  | + | 
|  | If it is `before`, then each new trailer will appear just before the | 
|  | first trailer with the same <token>. | 
|  |  | 
|  | trailer.ifexists:: | 
|  | This option makes it possible to choose what action will be | 
|  | performed when there is already at least one trailer with the | 
|  | same <token> in the message. | 
|  | + | 
|  | The valid values for this option are: `addIfDifferentNeighbor` (this | 
|  | is the default), `addIfDifferent`, `add`, `replace` or `doNothing`. | 
|  | + | 
|  | With `addIfDifferentNeighbor`, a new trailer will be added only if no | 
|  | trailer with the same (<token>, <value>) pair is above or below the line | 
|  | where the new trailer will be added. | 
|  | + | 
|  | With `addIfDifferent`, a new trailer will be added only if no trailer | 
|  | with the same (<token>, <value>) pair is already in the message. | 
|  | + | 
|  | With `add`, a new trailer will be added, even if some trailers with | 
|  | the same (<token>, <value>) pair are already in the message. | 
|  | + | 
|  | With `replace`, an existing trailer with the same <token> will be | 
|  | deleted and the new trailer will be added. The deleted trailer will be | 
|  | the closest one (with the same <token>) to the place where the new one | 
|  | will be added. | 
|  | + | 
|  | With `doNothing`, nothing will be done; that is no new trailer will be | 
|  | added if there is already one with the same <token> in the message. | 
|  |  | 
|  | trailer.ifmissing:: | 
|  | This option makes it possible to choose what action will be | 
|  | performed when there is not yet any trailer with the same | 
|  | <token> in the message. | 
|  | + | 
|  | The valid values for this option are: `add` (this is the default) and | 
|  | `doNothing`. | 
|  | + | 
|  | With `add`, a new trailer will be added. | 
|  | + | 
|  | With `doNothing`, nothing will be done. | 
|  |  | 
|  | trailer.<token>.key:: | 
|  | This `key` will be used instead of <token> in the trailer. At | 
|  | the end of this key, a separator can appear and then some | 
|  | space characters. By default the only valid separator is ':', | 
|  | but this can be changed using the `trailer.separators` config | 
|  | variable. | 
|  | + | 
|  | If there is a separator, then the key will be used instead of both the | 
|  | <token> and the default separator when adding the trailer. | 
|  |  | 
|  | trailer.<token>.where:: | 
|  | This option takes the same values as the 'trailer.where' | 
|  | configuration variable and it overrides what is specified by | 
|  | that option for trailers with the specified <token>. | 
|  |  | 
|  | trailer.<token>.ifexists:: | 
|  | This option takes the same values as the 'trailer.ifexists' | 
|  | configuration variable and it overrides what is specified by | 
|  | that option for trailers with the specified <token>. | 
|  |  | 
|  | trailer.<token>.ifmissing:: | 
|  | This option takes the same values as the 'trailer.ifmissing' | 
|  | configuration variable and it overrides what is specified by | 
|  | that option for trailers with the specified <token>. | 
|  |  | 
|  | trailer.<token>.command:: | 
|  | This option can be used to specify a shell command that will | 
|  | be called to automatically add or modify a trailer with the | 
|  | specified <token>. | 
|  | + | 
|  | When this option is specified, the behavior is as if a special | 
|  | '<token>=<value>' argument were added at the beginning of the command | 
|  | line, where <value> is taken to be the standard output of the | 
|  | specified command with any leading and trailing whitespace trimmed | 
|  | off. | 
|  | + | 
|  | If the command contains the `$ARG` string, this string will be | 
|  | replaced with the <value> part of an existing trailer with the same | 
|  | <token>, if any, before the command is launched. | 
|  | + | 
|  | If some '<token>=<value>' arguments are also passed on the command | 
|  | line, when a 'trailer.<token>.command' is configured, the command will | 
|  | also be executed for each of these arguments. And the <value> part of | 
|  | these arguments, if any, will be used to replace the `$ARG` string in | 
|  | the command. | 
|  |  | 
|  | EXAMPLES | 
|  | -------- | 
|  |  | 
|  | * Configure a 'sign' trailer with a 'Signed-off-by' key, and then | 
|  | add two of these trailers to a message: | 
|  | + | 
|  | ------------ | 
|  | $ git config trailer.sign.key "Signed-off-by" | 
|  | $ cat msg.txt | 
|  | subject | 
|  |  | 
|  | message | 
|  | $ cat msg.txt | git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>' | 
|  | subject | 
|  |  | 
|  | message | 
|  |  | 
|  | Signed-off-by: Alice <alice@example.com> | 
|  | Signed-off-by: Bob <bob@example.com> | 
|  | ------------ | 
|  |  | 
|  | * Use the `--in-place` option to edit a message file in place: | 
|  | + | 
|  | ------------ | 
|  | $ cat msg.txt | 
|  | subject | 
|  |  | 
|  | message | 
|  |  | 
|  | Signed-off-by: Bob <bob@example.com> | 
|  | $ git interpret-trailers --trailer 'Acked-by: Alice <alice@example.com>' --in-place msg.txt | 
|  | $ cat msg.txt | 
|  | subject | 
|  |  | 
|  | message | 
|  |  | 
|  | Signed-off-by: Bob <bob@example.com> | 
|  | Acked-by: Alice <alice@example.com> | 
|  | ------------ | 
|  |  | 
|  | * Extract the last commit as a patch, and add a 'Cc' and a | 
|  | 'Reviewed-by' trailer to it: | 
|  | + | 
|  | ------------ | 
|  | $ git format-patch -1 | 
|  | 0001-foo.patch | 
|  | $ git interpret-trailers --trailer 'Cc: Alice <alice@example.com>' --trailer 'Reviewed-by: Bob <bob@example.com>' 0001-foo.patch >0001-bar.patch | 
|  | ------------ | 
|  |  | 
|  | * Configure a 'sign' trailer with a command to automatically add a | 
|  | 'Signed-off-by: ' with the author information only if there is no | 
|  | 'Signed-off-by: ' already, and show how it works: | 
|  | + | 
|  | ------------ | 
|  | $ git config trailer.sign.key "Signed-off-by: " | 
|  | $ git config trailer.sign.ifmissing add | 
|  | $ git config trailer.sign.ifexists doNothing | 
|  | $ git config trailer.sign.command 'echo "$(git config user.name) <$(git config user.email)>"' | 
|  | $ git interpret-trailers <<EOF | 
|  | > EOF | 
|  |  | 
|  | Signed-off-by: Bob <bob@example.com> | 
|  | $ git interpret-trailers <<EOF | 
|  | > Signed-off-by: Alice <alice@example.com> | 
|  | > EOF | 
|  |  | 
|  | Signed-off-by: Alice <alice@example.com> | 
|  | ------------ | 
|  |  | 
|  | * Configure a 'fix' trailer with a key that contains a '#' and no | 
|  | space after this character, and show how it works: | 
|  | + | 
|  | ------------ | 
|  | $ git config trailer.separators ":#" | 
|  | $ git config trailer.fix.key "Fix #" | 
|  | $ echo "subject" | git interpret-trailers --trailer fix=42 | 
|  | subject | 
|  |  | 
|  | Fix #42 | 
|  | ------------ | 
|  |  | 
|  | * Configure a 'see' trailer with a command to show the subject of a | 
|  | commit that is related, and show how it works: | 
|  | + | 
|  | ------------ | 
|  | $ git config trailer.see.key "See-also: " | 
|  | $ git config trailer.see.ifExists "replace" | 
|  | $ git config trailer.see.ifMissing "doNothing" | 
|  | $ git config trailer.see.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" | 
|  | $ git interpret-trailers <<EOF | 
|  | > subject | 
|  | > | 
|  | > message | 
|  | > | 
|  | > see: HEAD~2 | 
|  | > EOF | 
|  | subject | 
|  |  | 
|  | message | 
|  |  | 
|  | See-also: fe3187489d69c4 (subject of related commit) | 
|  | ------------ | 
|  |  | 
|  | * Configure a commit template with some trailers with empty values | 
|  | (using sed to show and keep the trailing spaces at the end of the | 
|  | trailers), then configure a commit-msg hook that uses | 
|  | 'git interpret-trailers' to remove trailers with empty values and | 
|  | to add a 'git-version' trailer: | 
|  | + | 
|  | ------------ | 
|  | $ sed -e 's/ Z$/ /' >commit_template.txt <<EOF | 
|  | > ***subject*** | 
|  | > | 
|  | > ***message*** | 
|  | > | 
|  | > Fixes: Z | 
|  | > Cc: Z | 
|  | > Reviewed-by: Z | 
|  | > Signed-off-by: Z | 
|  | > EOF | 
|  | $ git config commit.template commit_template.txt | 
|  | $ cat >.git/hooks/commit-msg <<EOF | 
|  | > #!/bin/sh | 
|  | > git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new" | 
|  | > mv "\$1.new" "\$1" | 
|  | > EOF | 
|  | $ chmod +x .git/hooks/commit-msg | 
|  | ------------ | 
|  |  | 
|  | SEE ALSO | 
|  | -------- | 
|  | linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1] | 
|  |  | 
|  | GIT | 
|  | --- | 
|  | Part of the linkgit:git[1] suite |