'\" t
.\" Title: git-interpret-trailers
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
.\" Generator: DocBook XSL Stylesheets vsnapshot
.\" Date: 08/29/2024
.\" Manual: Git Manual
.\" Source: Git 2.46.0
.\" Language: English
.\"
.TH "GIT\-INTERPRET\-TRAILERS" "1" "08/29/2024" "Git 2\&.46\&.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
\fIgit interpret\-trailers\fR [\-\-in\-place] [\-\-trim\-empty]
[(\-\-trailer (|)[(=|:)])\&...]
[\-\-parse] [\&...]
.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 "Signed\-off\-by" are trailers\&.
.sp
This command reads commit messages from either the arguments or the standard input if no 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 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 "\-\-\-" 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 or \fI:\fR argument given using \fB\-\-trailer\fR will be appended after the existing trailers only if the last trailer has a different (, ) pair (or if there is no existing trailer)\&. The and parts will be trimmed to remove starting and trailing whitespace, and the resulting trimmed and 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 and will be separated by \fB\*(Aq: \*(Aq\fR (one colon followed by one space)\&.
.sp
For convenience, a can be configured to make using \fB\-\-trailer\fR shorter to type on the command line\&. This can be configured using the \fItrailer\&.\&.key\fR configuration variable\&. The must be a prefix of the full 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="sign: foo"\fR on the command line instead of \fB\-\-trailer="Signed\-off\-by: foo"\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 \fI\-\-\-\fR (followed by a space or the end of the line)\&.
.sp
When reading trailers, there can be no whitespace before or inside the , but any number of regular space and tab characters are allowed between the and the separator\&. There can be whitespaces before, inside or after the \&. The 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
\-\-in\-place
.RS 4
Edit the files in place\&.
.RE
.PP
\-\-trim\-empty
.RS 4
If the 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\&.
.RE
.PP
\-\-trailer [(=|:)]
.RS 4
Specify a (, ) pair that should be applied as a trailer to the inputs\&. See the description of this command\&.
.RE
.PP
\-\-where , \-\-no\-where
.RS 4
Specify where all new trailers will be added\&. A setting provided with
\fI\-\-where\fR
overrides the
\fBtrailer\&.where\fR
and any applicable
\fBtrailer\&.\&.where\fR
configuration variables and applies to all
\fI\-\-trailer\fR
options until the next occurrence of
\fI\-\-where\fR
or
\fI\-\-no\-where\fR\&. Upon encountering
\fI\-\-no\-where\fR, clear the effect of any previous use of
\fI\-\-where\fR, such that the relevant configuration variables are no longer overridden\&. Possible placements are
\fBafter\fR,
\fBbefore\fR,
\fBend\fR
or
\fBstart\fR\&.
.RE
.PP
\-\-if\-exists , \-\-no\-if\-exists
.RS 4
Specify what action will be performed when there is already at least one trailer with the same in the input\&. A setting provided with
\fI\-\-if\-exists\fR
overrides the
\fBtrailer\&.ifExists\fR
and any applicable
\fBtrailer\&.\&.ifExists\fR
configuration variables and applies to all
\fI\-\-trailer\fR
options until the next occurrence of
\fI\-\-if\-exists\fR
or
\fI\-\-no\-if\-exists\fR\&. Upon encountering \*(Aq\-\-no\-if\-exists, clear the effect of any previous use of \*(Aq\-\-if\-exists, such that the relevant configuration variables are no longer overridden\&. Possible actions are
\fBaddIfDifferent\fR,
\fBaddIfDifferentNeighbor\fR,
\fBadd\fR,
\fBreplace\fR
and
\fBdoNothing\fR\&.
.RE
.PP
\-\-if\-missing , \-\-no\-if\-missing
.RS 4
Specify what action will be performed when there is no other trailer with the same in the input\&. A setting provided with
\fI\-\-if\-missing\fR
overrides the
\fBtrailer\&.ifMissing\fR
and any applicable
\fBtrailer\&.\&.ifMissing\fR
configuration variables and applies to all
\fI\-\-trailer\fR
options until the next occurrence of
\fI\-\-if\-missing\fR
or
\fI\-\-no\-if\-missing\fR\&. Upon encountering \*(Aq\-\-no\-if\-missing, clear the effect of any previous use of \*(Aq\-\-if\-missing, such that the relevant configuration variables are no longer overridden\&. Possible actions are
\fBdoNothing\fR
or
\fBadd\fR\&.
.RE
.PP
\-\-only\-trailers
.RS 4
Output only the trailers, not any other parts of the input\&.
.RE
.PP
\-\-only\-input
.RS 4
Output only trailers that exist in the input; do not add any from the command\-line or by applying
\fBtrailer\&.*\fR
configuration variables\&.
.RE
.PP
\-\-unfold
.RS 4
If a trailer has a value that runs over multiple lines (aka "folded"), reformat the value into a single line\&.
.RE
.PP
\-\-parse
.RS 4
A convenience alias for
\fB\-\-only\-trailers \-\-only\-input \-\-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 \-\-unfold\&.
.RE
.PP
\-\-no\-divider
.RS 4
Do not treat
\fB\-\-\-\fR
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
\fBgit format\-patch\fR)\&.
.RE
.SH "CONFIGURATION VARIABLES"
.PP
trailer\&.separators
.RS 4
This option tells which characters are recognized as trailer separators\&. By default only
\fI:\fR
is recognized as a trailer separator, except that
\fI=\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 "%=$", then only lines using the format
\fI\fR
with containing
\fI%\fR,
\fI=\fR
or
\fI$\fR
and then spaces will be considered trailers\&. And
\fI%\fR
will be the default separator used, so by default trailers will appear like:
\fI% \fR
(one percent sign and one space will appear between the key and the value)\&.
.RE
.PP
trailer\&.where
.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 \&.
.sp
If it is
\fBbefore\fR, then each new trailer will appear just before the first trailer with the same \&.
.RE
.PP
trailer\&.ifexists
.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 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 (, ) 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 (, ) pair is already in the input\&.
.sp
With
\fBadd\fR, a new trailer will be added, even if some trailers with the same (, ) pair are already in the input\&.
.sp
With
\fBreplace\fR, an existing trailer with the same will be deleted and the new trailer will be added\&. The deleted trailer will be the closest one (with the same ) 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 in the input\&.
.RE
.PP
trailer\&.ifmissing
.RS 4
This option makes it possible to choose what action will be performed when there is not yet any trailer with the same 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
trailer\&.\&.key
.RS 4
Defines a for the \&. The must be a prefix (case does not matter) of the \&. For example, in
\fBgit config trailer\&.ack\&.key "Acked\-by"\fR
the "Acked\-by" is the and the "ack" is the \&. This configuration allows the shorter
\fB\-\-trailer "ack:\&.\&.\&."\fR
invocation on the command line using the "ack" instead of the longer
\fB\-\-trailer "Acked\-by:\&.\&.\&."\fR\&.
.sp
At the end of the , a separator can appear and then some space characters\&. By default the only valid separator is
\fI:\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
trailer\&.\&.where
.RS 4
This option takes the same values as the
\fItrailer\&.where\fR
configuration variable and it overrides what is specified by that option for trailers with the specified \&.
.RE
.PP
trailer\&.\&.ifexists
.RS 4
This option takes the same values as the
\fItrailer\&.ifexists\fR
configuration variable and it overrides what is specified by that option for trailers with the specified \&.
.RE
.PP
trailer\&.\&.ifmissing
.RS 4
This option takes the same values as the
\fItrailer\&.ifmissing\fR
configuration variable and it overrides what is specified by that option for trailers with the specified \&.
.RE
.PP
trailer\&.\&.command
.RS 4
Deprecated in favor of
\fItrailer\&.\&.cmd\fR\&. This option behaves in the same way as
\fItrailer\&.\&.cmd\fR, except that it doesn\(cqt pass anything as argument to the specified command\&. Instead the first occurrence of substring $ARG is replaced by the that would be passed as argument\&.
.sp
Note that $ARG in the user\(cqs command is only replaced once and that the original way of replacing $ARG is not safe\&.
.sp
When both
\fItrailer\&.\&.cmd\fR
and
\fItrailer\&.\&.command\fR
are given for the same ,
\fItrailer\&.\&.cmd\fR
is used and
\fItrailer\&.\&.command\fR
is ignored\&.
.RE
.PP
trailer\&.\&.cmd
.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 , and then called each time a
\fI\-\-trailer =\fR
argument is specified to modify the of the trailer that this option would produce\&.
.sp
When the specified command is first called to add a trailer with the specified , the behavior is as if a special
\fI\-\-trailer =\fR
argument was added at the beginning of the "git interpret\-trailers" command, where is taken to be the standard output of the command with any leading and trailing whitespace trimmed off\&.
.sp
If some
\fI\-\-trailer =\fR
arguments are also passed on the command line, the command is called again once for each of these arguments with the same \&. And the part of these arguments, if any, will be passed to the command as its first argument\&. This way the command can produce a computed from the passed in the
\fI\-\-trailer =\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
\fIsign\fR
trailer with a
\fISigned\-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
\fICc\fR
and a
\fIReviewed\-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
\fIsign\fR
trailer with a command to automatically add a \*(AqSigned\-off\-by: \*(Aq with the author information only if there is no \*(AqSigned\-off\-by: \*(Aq 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
\fIfix\fR
trailer with a key that contains a
\fI#\fR
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
\fIhelp\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
\fIref\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