'\" t .\" Title: git-interpret-trailers .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot .\" Date: 2026-06-29 .\" Manual: Git Manual .\" Source: Git 2.55.0 .\" Language: English .\" .TH "GIT\-INTERPRET\-TRAILERS" "1" "2026\-06\-29" "Git 2\&.55\&.0" "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\fR|\fI\fR)[(\fB=\fR|\fB:\fR)\fI\fR])\&...] [\fB\-\-parse\fR] [\fI\fR\&...] .fi .sp .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 Signed\-off\-by: Bob .fi .if n \{\ .RE .\} .sp .sp the last two lines starting with \fBSigned\-off\-by\fR are trailers\&. .sp This command reads commit messages from either the \fI\fR arguments or the standard input if no \fI\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\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\fR\fB=\fR\fI\fR or \fI\fR\fB:\fR\fI\fR argument given using \fB\-\-trailer\fR will be appended after the existing trailers only if the last trailer has a different (\fI\fR, \fI\fR) pair (or if there is no existing trailer)\&. The \fI\fR and \fI\fR parts will be trimmed to remove starting and trailing whitespace, and the resulting trimmed \fI\fR and \fI\fR will appear in the output like this: .sp .if n \{\ .RS 4 .\} .nf key: value .fi .if n \{\ .RE .\} .sp .sp This means that the trimmed \fI\fR and \fI\fR will be separated by "\fB:\fR\ \&" (one colon followed by one space)\&. .sp For convenience, a \fI\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\fR\fB\&.key\fR configuration variable\&. The \fI\fR must be a prefix of the full \fI\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 .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\fR, but any number of regular space and tab characters are allowed between the \fI\fR and the separator\&. There can be whitespaces before, inside or after the \fI\fR\&. The \fI\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 .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\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\fR[(\fB=\fR|\fB:\fR)\fI\fR], \fB\-\-no\-trailer\fR .RS 4 Specify a (\fI\fR, \fI\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\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\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\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\fR in the input\&. A setting provided with \fB\-\-if\-exists\fR overrides the \fBtrailer\&.ifExists\fR and any applicable \fBtrailer\&.\fR\fI\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\fR, \fB\-\-no\-if\-missing\fR .RS 4 Specify what action will be performed when there is no other trailer with the same \fI\fR in the input\&. A setting provided with \fB\-\-if\-missing\fR overrides the \fBtrailer\&.ifMissing\fR and any applicable \fBtrailer\&.\fR\fI\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\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\fR with \fI\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\fR\fB%\fR \fI\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\fR\&. .sp If it is \fBbefore\fR, then each new trailer will appear just before the first trailer with the same \fI\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\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\fR, \fI\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\fR, \fI\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\fR, \fI\fR) pair are already in the input\&. .sp With \fBreplace\fR, an existing trailer with the same \fI\fR will be deleted and the new trailer will be added\&. The deleted trailer will be the closest one (with the same \fI\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\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\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\fR\fB\&.key\fR .RS 4 Defines a \fI\fR for the \fI\fR\&. The \fI\fR must be a prefix (case does not matter) of the \fI\fR\&. For example, in \fBgit\fR \fBconfig\fR \fBtrailer\&.ack\&.key\fR "Acked\-by" the \fBAcked\-by\fR is the \fI\fR and the \fBack\fR is the \fI\fR\&. This configuration allows the shorter \fB\-\-trailer\fR "ack:\fB\&.\&.\&.\fR" invocation on the command line using the "ack" \fI\fR instead of the longer \fB\-\-trailer\fR "Acked\-by:\fB\&.\&.\&.\fR"\&. .sp At the end of the \fI\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\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\fR\&. .RE .PP \fBtrailer\&.\fR\fI\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\fR\&. .RE .PP \fBtrailer\&.\fR\fI\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\fR\&. .RE .PP \fBtrailer\&.\fR\fI\fR\fB\&.command\fR .RS 4 Deprecated in favor of \fBtrailer\&.\fR\fI\fR\fB\&.cmd\fR\&. This option behaves in the same way as \fBtrailer\&.\fR\fI\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\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\fR\fB\&.cmd\fR and \fBtrailer\&.\fR\fI\fR\fB\&.command\fR are given for the same \fI\fR, \fBtrailer\&.\fR\fI\fR\fB\&.cmd\fR is used and \fBtrailer\&.\fR\fI\fR\fB\&.command\fR is ignored\&. .RE .PP \fBtrailer\&.\fR\fI\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\fR, and then called each time a \fB\-\-trailer\fR \fI\fR\fB=\fR\fI\fR argument is specified to modify the \fI\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\fR, the behavior is as if a special \fB\-\-trailer\fR \fI\fR\fB=\fR\fI\fR argument was added at the beginning of \fBgit-interpret-trailers\fR(1), where \fI\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\fR\fB=\fR\fI\fR arguments are also passed on the command line, the command is called again once for each of these arguments with the same \fI\fR\&. And the \fI\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\fR computed from the \fI\fR passed in the \fB\-\-trailer\fR \fI\fR\fB=\fR\fI\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 \*(Aq \-\-trailer \*(Aqsign: Bob \*(Aq Signed\-off\-by: Bob .fi .if n \{\ .RE .\} .sp .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 $ git interpret\-trailers \-\-trailer \*(AqAcked\-by: Alice \*(Aq \-\-in\-place msg\&.txt $ cat msg\&.txt subject body text Signed\-off\-by: Bob Acked\-by: Alice .fi .if n \{\ .RE .\} .sp .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 \*(Aq \-\-trailer \*(AqReviewed\-by: Bob \*(Aq 0001\-foo\&.patch >0001\-bar\&.patch .fi .if n \{\ .RE .\} .sp .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 $ cat msg2\&.txt subject body text Signed\-off\-by: Alice $ git interpret\-trailers \-\-trailer sign .fi .if n \{\ .RE .\} .sp .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 .\} .sp .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" Helped\-by: Christian Couder .fi .if n \{\ .RE .\} .sp .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\&." 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 .\} .sp .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