| '\" t |
| .\" Title: git-interpret-trailers |
| .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] |
| .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/> |
| .\" Date: 2026-04-09 |
| .\" Manual: Git Manual |
| .\" Source: Git 2.54.0.rc1.54.g60f07c4f5c |
| .\" Language: English |
| .\" |
| .TH "GIT\-INTERPRET\-TRAILERS" "1" "2026-04-09" "Git 2\&.54\&.0\&.rc1\&.54\&.g6" "Git Manual" |
| .\" ----------------------------------------------------------------- |
| .\" * Define some portability stuff |
| .\" ----------------------------------------------------------------- |
| .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| .\" http://bugs.debian.org/507673 |
| .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html |
| .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| .ie \n(.g .ds Aq \(aq |
| .el .ds Aq ' |
| .\" ----------------------------------------------------------------- |
| .\" * set default formatting |
| .\" ----------------------------------------------------------------- |
| .\" disable hyphenation |
| .nh |
| .\" disable justification (adjust text to left margin only) |
| .ad l |
| .\" ----------------------------------------------------------------- |
| .\" * MAIN CONTENT STARTS HERE * |
| .\" ----------------------------------------------------------------- |
| .SH "NAME" |
| git-interpret-trailers \- Add or parse structured information in commit messages |
| .SH "SYNOPSIS" |
| .sp |
| .nf |
| \fBgit\fR \fBinterpret\-trailers\fR [\fB\-\-in\-place\fR] [\fB\-\-trim\-empty\fR] |
| [(\fB\-\-trailer\fR (\fI<key>\fR|\fI<key\-alias>\fR)[(\fB=\fR|\fB:\fR)\fI<value>\fR])\&...\:] |
| [\fB\-\-parse\fR] [\fI<file>\fR\&...\:] |
| .fi |
| .SH "DESCRIPTION" |
| .sp |
| Add or parse \fItrailer\fR lines that look similar to RFC 822 e\-mail headers, at the end of the otherwise free\-form part of a commit message\&. For example, in the following commit message |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| subject |
| |
| Lorem ipsum dolor sit amet, consectetur adipiscing elit\&. |
| |
| Signed\-off\-by: Alice <alice@example\&.com> |
| Signed\-off\-by: Bob <bob@example\&.com> |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| the last two lines starting with \fBSigned\-off\-by\fR are trailers\&. |
| .sp |
| This command reads commit messages from either the \fI<file>\fR arguments or the standard input if no \fI<file>\fR is specified\&. If \fB\-\-parse\fR is specified, the output consists of the parsed trailers coming from the input, without influencing them with any command line options or configuration variables\&. |
| .sp |
| Otherwise, this command applies \fBtrailer\&.\fR\fI<key\-alias>\fR configuration variables (which could potentially add new trailers, as well as reposition them), as well as any command line arguments that can override configuration variables (such as \fB\-\-trailer=\&.\&.\fR\&. which could also add new trailers), to each input file\&. The result is emitted on the standard output\&. |
| .sp |
| This command can also operate on the output of \fBgit-format-patch\fR(1), which is more elaborate than a plain commit message\&. Namely, such output includes a commit message (as above), a \fB\-\-\-\fR divider line, and a patch part\&. For these inputs, the divider and patch parts are not modified by this command and are emitted as is on the output, unless \fB\-\-no\-divider\fR is specified\&. |
| .sp |
| Some configuration variables control the way the \fB\-\-trailer\fR arguments are applied to each input and the way any existing trailer in the input is changed\&. They also make it possible to automatically add some trailers\&. |
| .sp |
| By default, a \fI<key>\fR\fB=\fR\fI<value>\fR or \fI<key>\fR\fB:\fR\fI<value>\fR argument given using \fB\-\-trailer\fR will be appended after the existing trailers only if the last trailer has a different (\fI<key>\fR, \fI<value>\fR) pair (or if there is no existing trailer)\&. The \fI<key>\fR and \fI<value>\fR parts will be trimmed to remove starting and trailing whitespace, and the resulting trimmed \fI<key>\fR and \fI<value>\fR will appear in the output like this: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| key: value |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| This means that the trimmed \fI<key>\fR and \fI<value>\fR will be separated by "\fB:\fR\ \&" (one colon followed by one space)\&. |
| .sp |
| For convenience, a \fI<key\-alias>\fR can be configured to make using \fB\-\-trailer\fR shorter to type on the command line\&. This can be configured using the \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.key\fR configuration variable\&. The \fI<key\-alias>\fR must be a prefix of the full \fI<key>\fR string, although case sensitivity does not matter\&. For example, if you have |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| trailer\&.sign\&.key "Signed\-off\-by: " |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| in your configuration, you only need to specify \fB\-\-trailer=\fR"sign: \fBfoo\fR" on the command line instead of \fB\-\-trailer=\fR"Signed\-off\-by: \fBfoo\fR"\&. |
| .sp |
| 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 at the end of the input\&. A blank line will be added before the new trailer if there isn\(cqt one already\&. |
| .sp |
| Existing trailers are extracted from the input 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 input or be the last non\-whitespace lines before a line that starts with \fB\-\-\-\fR (followed by a space or the end of the line)\&. |
| .sp |
| When reading trailers, there can be no whitespace before or inside the \fI<key>\fR, but any number of regular space and tab characters are allowed between the \fI<key>\fR and the separator\&. There can be whitespaces before, inside or after the \fI<value>\fR\&. The \fI<value>\fR may be split over multiple lines with each subsequent line starting with at least one whitespace, like the "folding" in RFC 822\&. Example: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| key: This is a very long value, with spaces and |
| newlines in it\&. |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| Note that trailers do not follow (nor are they intended to follow) many of the rules for RFC 822 headers\&. For example they do not follow the encoding rule\&. |
| .SH "OPTIONS" |
| .PP |
| \fB\-\-in\-place\fR, \fB\-\-no\-in\-place\fR |
| .RS 4 |
| Edit the files in place\&. The default is |
| \fB\-\-no\-in\-place\fR\&. |
| .RE |
| .PP |
| \fB\-\-trim\-empty\fR, \fB\-\-no\-trim\-empty\fR |
| .RS 4 |
| If the |
| \fI<value>\fR |
| part of any trailer contains only whitespace, the whole trailer will be removed from the output\&. This applies to existing trailers as well as new trailers\&. |
| .sp |
| The default is |
| \fB\-\-no\-trim\-empty\fR\&. |
| .RE |
| .PP |
| \fB\-\-trailer=\fR\fI<key>\fR[(\fB=\fR|\fB:\fR)\fI<value>\fR], \fB\-\-no\-trailer\fR |
| .RS 4 |
| Specify a (\fI<key>\fR, |
| \fI<value>\fR) pair that should be applied as a trailer to the inputs\&. See the description of this command\&. Can be given multiple times\&. |
| .sp |
| Use |
| \fB\-\-no\-trailer\fR |
| to reset the list\&. |
| .RE |
| .PP |
| \fB\-\-where=\fR\fI<placement>\fR, \fB\-\-no\-where\fR |
| .RS 4 |
| Specify where all new trailers will be added\&. A setting provided with |
| \fB\-\-where\fR |
| overrides the |
| \fBtrailer\&.where\fR |
| and any applicable |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.where\fR |
| configuration variables and applies to all |
| \fB\-\-trailer\fR |
| options until the next occurrence of |
| \fB\-\-where\fR |
| or |
| \fB\-\-no\-where\fR\&. Possible placements are |
| \fBafter\fR, |
| \fBbefore\fR, |
| \fBend\fR |
| or |
| \fBstart\fR\&. |
| .sp |
| Use |
| \fB\-\-no\-where\fR |
| to clear the effect of any previous use of |
| \fB\-\-where\fR, such that the relevant configuration variables are no longer overridden\&. |
| .RE |
| .PP |
| \fB\-\-if\-exists=\fR\fI<action>\fR, \fB\-\-no\-if\-exists\fR |
| .RS 4 |
| Specify what action will be performed when there is already at least one trailer with the same |
| \fI<key>\fR |
| in the input\&. A setting provided with |
| \fB\-\-if\-exists\fR |
| overrides the |
| \fBtrailer\&.ifExists\fR |
| and any applicable |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.ifExists\fR |
| configuration variables and applies to all |
| \fB\-\-trailer\fR |
| options until the next occurrence of |
| \fB\-\-if\-exists\fR |
| or |
| \fB\-\-no\-if\-exists\fR\&. Possible actions are |
| \fBaddIfDifferent\fR, |
| \fBaddIfDifferentNeighbor\fR, |
| \fBadd\fR, |
| \fBreplace\fR |
| and |
| \fBdoNothing\fR\&. |
| .sp |
| Use |
| \fB\-\-no\-if\-exists\fR |
| to clear the effect of any previous use of |
| \fB\-\-if\-exists\fR, such that the relevant configuration variables are no longer overridden\&. |
| .RE |
| .PP |
| \fB\-\-if\-missing=\fR\fI<action>\fR, \fB\-\-no\-if\-missing\fR |
| .RS 4 |
| Specify what action will be performed when there is no other trailer with the same |
| \fI<key>\fR |
| in the input\&. A setting provided with |
| \fB\-\-if\-missing\fR |
| overrides the |
| \fBtrailer\&.ifMissing\fR |
| and any applicable |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.ifMissing\fR |
| configuration variables and applies to all |
| \fB\-\-trailer\fR |
| options until the next occurrence of |
| \fB\-\-if\-missing\fR |
| or |
| \fB\-\-no\-if\-missing\fR\&. Possible actions are |
| \fBdoNothing\fR |
| or |
| \fBadd\fR\&. |
| .sp |
| Use |
| \fB\-\-no\-if\-missing\fR |
| to clear the effect of any previous use of |
| \fB\-\-if\-missing\fR, such that the relevant configuration variables are no longer overridden\&. |
| .RE |
| .PP |
| \fB\-\-only\-trailers\fR, \fB\-\-no\-only\-trailers\fR |
| .RS 4 |
| Output only the trailers, not any other parts of the input\&. The default is |
| \fB\-\-no\-only\-trailers\fR\&. |
| .RE |
| .PP |
| \fB\-\-only\-input\fR, \fB\-\-no\-only\-input\fR |
| .RS 4 |
| Output only trailers that exist in the input; do not add any from the command\-line or by applying |
| \fBtrailer\&.\fR\fI<key\-alias>\fR |
| configuration variables\&. The default is |
| \fB\-\-no\-only\-input\fR\&. |
| .RE |
| .PP |
| \fB\-\-unfold\fR, \fB\-\-no\-unfold\fR |
| .RS 4 |
| If a trailer has a value that runs over multiple lines (aka "folded"), reformat the value into a single line\&. The default is |
| \fB\-\-no\-unfold\fR\&. |
| .RE |
| .PP |
| \fB\-\-parse\fR |
| .RS 4 |
| A convenience alias for |
| \fB\-\-only\-trailers\fR |
| \fB\-\-only\-input\fR |
| \fB\-\-unfold\fR\&. This makes it easier to only see the trailers coming from the input without influencing them with any command line options or configuration variables, while also making the output machine\-friendly with |
| \fB\-\-unfold\fR\&. |
| .sp |
| There is no convenience alias to negate this alias\&. |
| .RE |
| .PP |
| \fB\-\-divider\fR, \fB\-\-no\-divider\fR |
| .RS 4 |
| Treat |
| \fB\-\-\-\fR |
| as the end of the commit message\&. This is the default\&. Use |
| \fB\-\-no\-divider\fR |
| when you know your input contains just the commit message itself (and not an email or the output of |
| \fBgit-format-patch\fR(1))\&. |
| .RE |
| .SH "CONFIGURATION VARIABLES" |
| .sp |
| Everything below this line in this section is selectively included from the \fBgit-config\fR(1) documentation\&. The content is the same as what\(cqs found there: |
| .PP |
| \fBtrailer\&.separators\fR |
| .RS 4 |
| This option tells which characters are recognized as trailer separators\&. By default only |
| \fB:\fR |
| is recognized as a trailer separator, except that |
| \fB=\fR |
| is always accepted on the command line for compatibility with other git commands\&. |
| .sp |
| 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\&. |
| .sp |
| For example, if the value for this option is |
| \fB%=$\fR, then only lines using the format |
| \fI<key><sep><value>\fR |
| with |
| \fI<sep>\fR |
| containing |
| \fB%\fR, |
| \fB=\fR |
| or |
| \fB$\fR |
| and then spaces will be considered trailers\&. And |
| \fB%\fR |
| will be the default separator used, so by default trailers will appear like: |
| \fI<key>\fR\fB%\fR |
| \fI<value>\fR |
| (one percent sign and one space will appear between the key and the value)\&. |
| .RE |
| .PP |
| \fBtrailer\&.where\fR |
| .RS 4 |
| This option tells where a new trailer will be added\&. |
| .sp |
| This can be |
| \fBend\fR, which is the default, |
| \fBstart\fR, |
| \fBafter\fR |
| or |
| \fBbefore\fR\&. |
| .sp |
| If it is |
| \fBend\fR, then each new trailer will appear at the end of the existing trailers\&. |
| .sp |
| If it is |
| \fBstart\fR, then each new trailer will appear at the start, instead of the end, of the existing trailers\&. |
| .sp |
| If it is |
| \fBafter\fR, then each new trailer will appear just after the last trailer with the same |
| \fI<key>\fR\&. |
| .sp |
| If it is |
| \fBbefore\fR, then each new trailer will appear just before the first trailer with the same |
| \fI<key>\fR\&. |
| .RE |
| .PP |
| \fBtrailer\&.ifexists\fR |
| .RS 4 |
| This option makes it possible to choose what action will be performed when there is already at least one trailer with the same |
| \fI<key>\fR |
| in the input\&. |
| .sp |
| The valid values for this option are: |
| \fBaddIfDifferentNeighbor\fR |
| (this is the default), |
| \fBaddIfDifferent\fR, |
| \fBadd\fR, |
| \fBreplace\fR |
| or |
| \fBdoNothing\fR\&. |
| .sp |
| With |
| \fBaddIfDifferentNeighbor\fR, a new trailer will be added only if no trailer with the same (\fI<key>\fR, |
| \fI<value>\fR) pair is above or below the line where the new trailer will be added\&. |
| .sp |
| With |
| \fBaddIfDifferent\fR, a new trailer will be added only if no trailer with the same (\fI<key>\fR, |
| \fI<value>\fR) pair is already in the input\&. |
| .sp |
| With |
| \fBadd\fR, a new trailer will be added, even if some trailers with the same (\fI<key>\fR, |
| \fI<value>\fR) pair are already in the input\&. |
| .sp |
| With |
| \fBreplace\fR, an existing trailer with the same |
| \fI<key>\fR |
| will be deleted and the new trailer will be added\&. The deleted trailer will be the closest one (with the same |
| \fI<key>\fR) to the place where the new one will be added\&. |
| .sp |
| With |
| \fBdoNothing\fR, nothing will be done; that is no new trailer will be added if there is already one with the same |
| \fI<key>\fR |
| in the input\&. |
| .RE |
| .PP |
| \fBtrailer\&.ifmissing\fR |
| .RS 4 |
| This option makes it possible to choose what action will be performed when there is not yet any trailer with the same |
| \fI<key>\fR |
| in the input\&. |
| .sp |
| The valid values for this option are: |
| \fBadd\fR |
| (this is the default) and |
| \fBdoNothing\fR\&. |
| .sp |
| With |
| \fBadd\fR, a new trailer will be added\&. |
| .sp |
| With |
| \fBdoNothing\fR, nothing will be done\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.key\fR |
| .RS 4 |
| Defines a |
| \fI<key\-alias>\fR |
| for the |
| \fI<key>\fR\&. The |
| \fI<key\-alias>\fR |
| must be a prefix (case does not matter) of the |
| \fI<key>\fR\&. For example, in |
| \fBgit\fR |
| \fBconfig\fR |
| \fBtrailer\&.ack\&.key\fR |
| "Acked\-by" the |
| \fBAcked\-by\fR |
| is the |
| \fI<key>\fR |
| and the |
| \fBack\fR |
| is the |
| \fI<key\-alias>\fR\&. This configuration allows the shorter |
| \fB\-\-trailer\fR |
| "ack:\fB\&.\&.\&.\fR" invocation on the command line using the "ack" |
| \fI<key\-alias>\fR |
| instead of the longer |
| \fB\-\-trailer\fR |
| "Acked\-by:\fB\&.\&.\&.\fR"\&. |
| .sp |
| At the end of the |
| \fI<key>\fR, a separator can appear and then some space characters\&. By default the only valid separator is |
| \fB:\fR, but this can be changed using the |
| \fBtrailer\&.separators\fR |
| config variable\&. |
| .sp |
| If there is a separator in the key, then it overrides the default separator when adding the trailer\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.where\fR |
| .RS 4 |
| This option takes the same values as the |
| \fBtrailer\&.where\fR |
| configuration variable and it overrides what is specified by that option for trailers with the specified |
| \fI<key\-alias>\fR\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.ifexists\fR |
| .RS 4 |
| This option takes the same values as the |
| \fBtrailer\&.ifexists\fR |
| configuration variable and it overrides what is specified by that option for trailers with the specified |
| \fI<key\-alias>\fR\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.ifmissing\fR |
| .RS 4 |
| This option takes the same values as the |
| \fBtrailer\&.ifmissing\fR |
| configuration variable and it overrides what is specified by that option for trailers with the specified |
| \fI<key\-alias>\fR\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.command\fR |
| .RS 4 |
| Deprecated in favor of |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.cmd\fR\&. This option behaves in the same way as |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.cmd\fR, except that it doesn\(cqt pass anything as argument to the specified command\&. Instead the first occurrence of substring |
| \fB$ARG\fR |
| is replaced by the |
| \fI<value>\fR |
| that would be passed as argument\&. |
| .sp |
| Note that |
| \fB$ARG\fR |
| in the user\(cqs command is only replaced once and that the original way of replacing |
| \fB$ARG\fR |
| is not safe\&. |
| .sp |
| When both |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.cmd\fR |
| and |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.command\fR |
| are given for the same |
| \fI<key\-alias>\fR, |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.cmd\fR |
| is used and |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.command\fR |
| is ignored\&. |
| .RE |
| .PP |
| \fBtrailer\&.\fR\fI<key\-alias>\fR\fB\&.cmd\fR |
| .RS 4 |
| This option can be used to specify a shell command that will be called once to automatically add a trailer with the specified |
| \fI<key\-alias>\fR, and then called each time a |
| \fB\-\-trailer\fR |
| \fI<key\-alias>\fR\fB=\fR\fI<value>\fR |
| argument is specified to modify the |
| \fI<value>\fR |
| of the trailer that this option would produce\&. |
| .sp |
| When the specified command is first called to add a trailer with the specified |
| \fI<key\-alias>\fR, the behavior is as if a special |
| \fB\-\-trailer\fR |
| \fI<key\-alias>\fR\fB=\fR\fI<value>\fR |
| argument was added at the beginning of |
| \fBgit-interpret-trailers\fR(1), where |
| \fI<value>\fR |
| is taken to be the standard output of the command with any leading and trailing whitespace trimmed off\&. |
| .sp |
| If some |
| \fB\-\-trailer\fR |
| \fI<key\-alias>\fR\fB=\fR\fI<value>\fR |
| arguments are also passed on the command line, the command is called again once for each of these arguments with the same |
| \fI<key\-alias>\fR\&. And the |
| \fI<value>\fR |
| part of these arguments, if any, will be passed to the command as its first argument\&. This way the command can produce a |
| \fI<value>\fR |
| computed from the |
| \fI<value>\fR |
| passed in the |
| \fB\-\-trailer\fR |
| \fI<key\-alias>\fR\fB=\fR\fI<value>\fR |
| argument\&. |
| .RE |
| .SH "EXAMPLES" |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBsign\fR |
| trailer with a |
| \fBSigned\-off\-by\fR |
| key, and then add two of these trailers to a commit message file: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git config trailer\&.sign\&.key "Signed\-off\-by" |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| $ git interpret\-trailers \-\-trailer \*(Aqsign: Alice <alice@example\&.com>\*(Aq \-\-trailer \*(Aqsign: Bob <bob@example\&.com>\*(Aq <msg\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Alice <alice@example\&.com> |
| Signed\-off\-by: Bob <bob@example\&.com> |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Use the |
| \fB\-\-in\-place\fR |
| option to edit a commit message file in place: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Bob <bob@example\&.com> |
| $ git interpret\-trailers \-\-trailer \*(AqAcked\-by: Alice <alice@example\&.com>\*(Aq \-\-in\-place msg\&.txt |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Bob <bob@example\&.com> |
| Acked\-by: Alice <alice@example\&.com> |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Extract the last commit as a patch, and add a |
| \fBCc\fR |
| and a |
| \fBReviewed\-by\fR |
| trailer to it: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git format\-patch \-1 |
| 0001\-foo\&.patch |
| $ git interpret\-trailers \-\-trailer \*(AqCc: Alice <alice@example\&.com>\*(Aq \-\-trailer \*(AqReviewed\-by: Bob <bob@example\&.com>\*(Aq 0001\-foo\&.patch >0001\-bar\&.patch |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBsign\fR |
| trailer with a command to automatically add a "\fBSigned\-off\-by:\fR\ \&" with the author information only if there is no "\fBSigned\-off\-by:\fR\ \&" already, and show how it works: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat msg1\&.txt |
| subject |
| |
| body text |
| $ git config trailer\&.sign\&.key "Signed\-off\-by: " |
| $ git config trailer\&.sign\&.ifmissing add |
| $ git config trailer\&.sign\&.ifexists doNothing |
| $ git config trailer\&.sign\&.cmd \*(Aqecho "$(git config user\&.name) <$(git config user\&.email)>"\*(Aq |
| $ git interpret\-trailers \-\-trailer sign <msg1\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Bob <bob@example\&.com> |
| $ cat msg2\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Alice <alice@example\&.com> |
| $ git interpret\-trailers \-\-trailer sign <msg2\&.txt |
| subject |
| |
| body text |
| |
| Signed\-off\-by: Alice <alice@example\&.com> |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBfix\fR |
| trailer with a key that contains a # and no space after this character, and show how it works: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git config trailer\&.separators ":#" |
| $ git config trailer\&.fix\&.key "Fix #" |
| $ echo "subject" | git interpret\-trailers \-\-trailer fix=42 |
| subject |
| |
| Fix #42 |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBhelp\fR |
| trailer with a cmd use a script |
| \fBglog\-find\-author\fR |
| which search specified author identity from git log in git repository and show how it works: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat ~/bin/glog\-find\-author |
| #!/bin/sh |
| test \-n "$1" && git log \-\-author="$1" \-\-pretty="%an <%ae>" \-1 || true |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| $ git config trailer\&.help\&.key "Helped\-by: " |
| $ git config trailer\&.help\&.ifExists "addIfDifferentNeighbor" |
| $ git config trailer\&.help\&.cmd "~/bin/glog\-find\-author" |
| $ git interpret\-trailers \-\-trailer="help:Junio" \-\-trailer="help:Couder" <msg\&.txt |
| subject |
| |
| body text |
| |
| Helped\-by: Junio C Hamano <gitster@pobox\&.com> |
| Helped\-by: Christian Couder <christian\&.couder@gmail\&.com> |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBref\fR |
| trailer with a cmd use a script |
| \fBglog\-grep\fR |
| to grep last relevant commit from git log in the git repository and show how it works: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat ~/bin/glog\-grep |
| #!/bin/sh |
| test \-n "$1" && git log \-\-grep "$1" \-\-pretty=reference \-1 || true |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| $ git config trailer\&.ref\&.key "Reference\-to: " |
| $ git config trailer\&.ref\&.ifExists "replace" |
| $ git config trailer\&.ref\&.cmd "~/bin/glog\-grep" |
| $ git interpret\-trailers \-\-trailer="ref:Add copyright notices\&." <msg\&.txt |
| subject |
| |
| body text |
| |
| Reference\-to: 8bc9a0c769 (Add copyright notices\&., 2005\-04\-07) |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Configure a |
| \fBsee\fR |
| trailer with a command to show the subject of a commit that is related, and show how it works: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat msg\&.txt |
| subject |
| |
| body text |
| |
| see: HEAD~2 |
| $ cat ~/bin/glog\-ref |
| #!/bin/sh |
| git log \-1 \-\-oneline \-\-format="%h (%s)" \-\-abbrev\-commit \-\-abbrev=14 |
| $ git config trailer\&.see\&.key "See\-also: " |
| $ git config trailer\&.see\&.ifExists "replace" |
| $ git config trailer\&.see\&.ifMissing "doNothing" |
| $ git config trailer\&.see\&.cmd "glog\-ref" |
| $ git interpret\-trailers \-\-trailer=see <msg\&.txt |
| subject |
| |
| body text |
| |
| See\-also: fe3187489d69c4 (subject of related commit) |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| 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(1) to remove trailers with empty values and to add a |
| \fBgit\-version\fR |
| trailer: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat temp\&.txt |
| ***subject*** |
| |
| ***message*** |
| |
| Fixes: Z |
| Cc: Z |
| Reviewed\-by: Z |
| Signed\-off\-by: Z |
| $ sed \-e \*(Aqs/ Z$/ /\*(Aq temp\&.txt > commit_template\&.txt |
| $ git config commit\&.template commit_template\&.txt |
| $ cat \&.git/hooks/commit\-msg |
| #!/bin/sh |
| git interpret\-trailers \-\-trim\-empty \-\-trailer "git\-version: \e$(git describe)" "\e$1" > "\e$1\&.new" |
| mv "\e$1\&.new" "\e$1" |
| $ chmod +x \&.git/hooks/commit\-msg |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .RE |
| .SH "SEE ALSO" |
| .sp |
| \fBgit-commit\fR(1), \fBgit-format-patch\fR(1), \fBgit-config\fR(1) |
| .SH "GIT" |
| .sp |
| Part of the \fBgit\fR(1) suite |