| 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 |