| 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 '---'. Such three | 
 | minus signs start the patch part of the message. | 
 |  | 
 | 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'. | 
 |  | 
 | --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'. | 
 |  | 
 | --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'. | 
 |  | 
 | --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`. | 
 |  | 
 | 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 |