Merge branch 'kh/doc-interpret-trailers-1' into jch

Doc updates.

* kh/doc-interpret-trailers-1:
  interpret-trailers: use placeholder instead of *
  doc: config: convert trailers section to synopsis style
  doc: interpret-trailers: normalize and fill out options
  doc: interpret-trailers: convert to synopsis style
This commit is contained in:
Junio C Hamano
2026-03-25 13:03:23 -07:00
3 changed files with 167 additions and 145 deletions

View File

@@ -1,21 +1,21 @@
trailer.separators::
`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
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 '<key><sep><value>' with <sep> containing '%', '='
or '$' and then spaces will be considered trailers. And '%' will be
For example, if the value for this option is `%=$`, then only lines
using the format _<key><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:
'<key>% <value>' (one percent sign and one space will appear between
`<key>% <value>` (one percent sign and one space will appear between
the key and the value).
trailer.where::
`trailer.where`::
This option tells where a new trailer will be added.
+
This can be `end`, which is the default, `start`, `after` or `before`.
@@ -27,41 +27,41 @@ 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 <key>.
last trailer with the same _<key>_.
+
If it is `before`, then each new trailer will appear just before the
first trailer with the same <key>.
first trailer with the same _<key>_.
trailer.ifexists::
`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 <key> in the input.
same _<key>_ in the input.
+
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 (<key>, <value>) pair is above or below the line
trailer with the same (_<key>_, _<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 (<key>, <value>) pair is already in the input.
with the same (_<key>_, _<value>_) pair is already in the input.
+
With `add`, a new trailer will be added, even if some trailers with
the same (<key>, <value>) pair are already in the input.
the same (_<key>_, _<value>_) pair are already in the input.
+
With `replace`, an existing trailer with the same <key> will be
With `replace`, an existing trailer with the same _<key>_ will be
deleted and the new trailer will be added. The deleted trailer will be
the closest one (with the same <key>) to the place where the new one
the closest one (with the same _<key>_) 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 <key> in the input.
added if there is already one with the same _<key>_ in the input.
trailer.ifmissing::
`trailer.ifmissing`::
This option makes it possible to choose what action will be
performed when there is not yet any trailer with the same
<key> in the input.
_<key>_ in the input.
+
The valid values for this option are: `add` (this is the default) and
`doNothing`.
@@ -70,67 +70,68 @@ With `add`, a new trailer will be added.
+
With `doNothing`, nothing will be done.
trailer.<keyAlias>.key::
Defines a <keyAlias> for the <key>. The <keyAlias> must be a
prefix (case does not matter) of the <key>. For example, in `git
config trailer.ack.key "Acked-by"` the "Acked-by" is the <key> and
the "ack" is the <keyAlias>. This configuration allows the shorter
`trailer.<key-alias>.key`::
Defines a _<key-alias>_ for the _<key>_. The _<key-alias>_ must be a
prefix (case does not matter) of the _<key>_. For example, in `git
config trailer.ack.key "Acked-by"` the `Acked-by` is the _<key>_ and
the `ack` is the _<key-alias>_. This configuration allows the shorter
`--trailer "ack:..."` invocation on the command line using the "ack"
<keyAlias> instead of the longer `--trailer "Acked-by:..."`.
`<key-alias>` instead of the longer `--trailer "Acked-by:..."`.
+
At the end of the <key>, a separator can appear and then some
space characters. By default the only valid separator is ':',
At the end of the _<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 in the key, then it overrides the default
separator when adding the trailer.
trailer.<keyAlias>.where::
This option takes the same values as the 'trailer.where'
`trailer.<key-alias>.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 <keyAlias>.
that option for trailers with the specified _<key-alias>_.
trailer.<keyAlias>.ifexists::
This option takes the same values as the 'trailer.ifexists'
`trailer.<key-alias>.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 <keyAlias>.
that option for trailers with the specified _<key-alias>_.
trailer.<keyAlias>.ifmissing::
This option takes the same values as the 'trailer.ifmissing'
`trailer.<key-alias>.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 <keyAlias>.
that option for trailers with the specified _<key-alias>_.
trailer.<keyAlias>.command::
Deprecated in favor of 'trailer.<keyAlias>.cmd'.
This option behaves in the same way as 'trailer.<keyAlias>.cmd', except
`trailer.<key-alias>.command`::
Deprecated in favor of `trailer.<key-alias>.cmd`.
This option behaves in the same way as `trailer.<key-alias>.cmd`, except
that it doesn't pass anything as argument to the specified command.
Instead the first occurrence of substring $ARG is replaced by the
<value> that would be passed as argument.
Instead the first occurrence of substring `$ARG` is replaced by the
_<value>_ that would be passed as argument.
+
Note that $ARG in the user's command is
only replaced once and that the original way of replacing $ARG is not safe.
Note that `$ARG` in the user's command is
only replaced once and that the original way of replacing `$ARG` is not safe.
+
When both 'trailer.<keyAlias>.cmd' and 'trailer.<keyAlias>.command' are given
for the same <keyAlias>, 'trailer.<keyAlias>.cmd' is used and
'trailer.<keyAlias>.command' is ignored.
When both `trailer.<key-alias>.cmd` and `trailer.<key-alias>.command` are given
for the same _<key-alias>_, `trailer.<key-alias>.cmd` is used and
`trailer.<key-alias>.command` is ignored.
trailer.<keyAlias>.cmd::
`trailer.<key-alias>.cmd`::
This option can be used to specify a shell command that will be called
once to automatically add a trailer with the specified <keyAlias>, and then
called each time a '--trailer <keyAlias>=<value>' argument is specified to
modify the <value> of the trailer that this option would produce.
once to automatically add a trailer with the specified _<key-alias>_, and then
called each time a `--trailer <key-alias>=<value>` argument is specified to
modify the _<value>_ of the trailer that this option would produce.
+
When the specified command is first called to add a trailer
with the specified <keyAlias>, the behavior is as if a special
'--trailer <keyAlias>=<value>' argument was added at the beginning
of the "git interpret-trailers" command, where <value>
is taken to be the standard output of the command with any
leading and trailing whitespace trimmed off.
with the specified _<key-alias>_, the behavior is as if a special
`--trailer <key-alias>=<value>` argument was added at the beginning
of linkgit:git-interpret-trailers[1], where _<value>_ is taken to be the
standard output of the command with any leading and trailing whitespace
trimmed off.
+
If some '--trailer <keyAlias>=<value>' arguments are also passed
If some `--trailer <key-alias>=<value>` arguments are also passed
on the command line, the command is called again once for each
of these arguments with the same <keyAlias>. And the <value> part
of these arguments with the same _<key-alias>_. And the _<value>_ part
of these arguments, if any, will be passed to the command as its
first argument. This way the command can produce a <value> computed
from the <value> passed in the '--trailer <keyAlias>=<value>' argument.
first argument. This way the command can produce a _<value>_ computed
from the _<value>_ passed in the `--trailer <key-alias>=<value>`
argument.

View File

@@ -7,14 +7,14 @@ git-interpret-trailers - Add or parse structured information in commit messages
SYNOPSIS
--------
[verse]
'git interpret-trailers' [--in-place] [--trim-empty]
[synopsis]
git interpret-trailers [--in-place] [--trim-empty]
[(--trailer (<key>|<key-alias>)[(=|:)<value>])...]
[--parse] [<file>...]
DESCRIPTION
-----------
Add or parse 'trailer' lines that look similar to RFC 822 e-mail
Add or parse _trailer_ 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
@@ -27,23 +27,24 @@ Signed-off-by: Alice <alice@example.com>
Signed-off-by: Bob <bob@example.com>
------------------------------------------------
the last two lines starting with "Signed-off-by" are trailers.
the last two lines starting with `Signed-off-by` are trailers.
This command reads commit messages from either the
<file> arguments or the standard input if no <file> is specified.
_<file>_ arguments or the standard input if no _<file>_ is specified.
If `--parse` is specified, the output consists of the parsed trailers
coming from the input, without influencing them with any command line
options or configuration variables.
Otherwise, this command applies `trailer.*` 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 `--trailer=...` which could also add new trailers),
to each input file. The result is emitted on the standard output.
Otherwise, this command applies `trailer.<key-alias>` 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 `--trailer=...` which could
also add new trailers), to each input file. The result is emitted on the
standard output.
This command can also operate on the output of linkgit:git-format-patch[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.
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
`--no-divider` is specified.
@@ -53,24 +54,24 @@ 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.
By default, a '<key>=<value>' or '<key>:<value>' argument given
By default, a `<key>=<value>` or `<key>:<value>` argument given
using `--trailer` will be appended after the existing trailers only if
the last trailer has a different (<key>, <value>) pair (or if there
is no existing trailer). The <key> and <value> parts will be trimmed
the last trailer has a different (_<key>_, _<value>_) pair (or if there
is no existing trailer). The _<key>_ and _<value>_ parts will be trimmed
to remove starting and trailing whitespace, and the resulting trimmed
<key> and <value> will appear in the output like this:
_<key>_ and _<value>_ will appear in the output like this:
------------------------------------------------
key: value
------------------------------------------------
This means that the trimmed <key> and <value> will be separated by
`': '` (one colon followed by one space).
This means that the trimmed _<key>_ and _<value>_ will be separated by
"`:`{nbsp}" (one colon followed by one space).
For convenience, a <key-alias> can be configured to make using `--trailer`
For convenience, a _<key-alias>_ can be configured to make using `--trailer`
shorter to type on the command line. This can be configured using the
'trailer.<key-alias>.key' configuration variable. The <keyAlias> must be a prefix
of the full <key> string, although case sensitivity does not matter. For
`trailer.<key-alias>.key` configuration variable. The _<key-alias>_ must be a prefix
of the full _<key>_ string, although case sensitivity does not matter. For
example, if you have
------------------------------------------------
@@ -91,13 +92,13 @@ 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 '---' (followed by a
non-whitespace lines before a line that starts with `---` (followed by a
space or the end of the line).
When reading trailers, there can be no whitespace before or inside the
<key>, but any number of regular space and tab characters are allowed
between the <key> and the separator. There can be whitespaces before,
inside or after the <value>. The <value> may be split over multiple lines
_<key>_, but any number of regular space and tab characters are allowed
between the _<key>_ and the separator. There can be whitespaces before,
inside or after the _<value>_. The _<value>_ may be split over multiple lines
with each subsequent line starting with at least one whitespace, like
the "folding" in RFC 822. Example:
@@ -111,77 +112,97 @@ rules for RFC 822 headers. For example they do not follow the encoding rule.
OPTIONS
-------
--in-place::
Edit the files in place.
`--in-place`::
`--no-in-place`::
Edit the files in place. The default is `--no-in-place`.
--trim-empty::
If the <value> part of any trailer contains only whitespace,
`--trim-empty`::
`--no-trim-empty`::
If the _<value>_ 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.
+
The default is `--no-trim-empty`.
--trailer <key>[(=|:)<value>]::
Specify a (<key>, <value>) pair that should be applied as a
trailer to the inputs. See the description of this
command.
`--trailer=<key>[(=|:)<value>]`::
`--no-trailer`::
Specify a (_<key>_, _<value>_) pair that should be applied as a
trailer to the inputs. See the description of this command. Can
be given multiple times.
+
Use `--no-trailer` to reset the list.
--where <placement>::
--no-where::
`--where=<placement>`::
`--no-where`::
Specify where all new trailers will be added. A setting
provided with '--where' overrides the `trailer.where` and any
applicable `trailer.<keyAlias>.where` configuration variables
and applies to all '--trailer' options until the next occurrence of
'--where' or '--no-where'. Upon encountering '--no-where', clear the
effect of any previous use of '--where', such that the relevant configuration
variables are no longer overridden. Possible placements are `after`,
provided with `--where` overrides the `trailer.where` and any
applicable `trailer.<key-alias>.where` configuration variables
and applies to all `--trailer` options until the next occurrence of
`--where` or `--no-where`. Possible placements are `after`,
`before`, `end` or `start`.
+
Use `--no-where` to clear the effect of any previous use of `--where`,
such that the relevant configuration variables are no longer overridden.
--if-exists <action>::
--no-if-exists::
`--if-exists=<action>`::
`--no-if-exists`::
Specify what action will be performed when there is already at
least one trailer with the same <key> in the input. A setting
provided with '--if-exists' overrides the `trailer.ifExists` and any
applicable `trailer.<keyAlias>.ifExists` configuration variables
and applies to all '--trailer' options until the next occurrence of
'--if-exists' or '--no-if-exists'. Upon encountering '--no-if-exists', clear the
effect of any previous use of '--if-exists', such that the relevant configuration
variables are no longer overridden. Possible actions are `addIfDifferent`,
least one trailer with the same _<key>_ in the input. A setting
provided with `--if-exists` overrides the `trailer.ifExists` and any
applicable `trailer.<key-alias>.ifExists` 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`.
+
Use `--no-if-exists` to clear the effect of any previous use of
`--if-exists`, such that the relevant configuration variables are no
longer overridden.
--if-missing <action>::
--no-if-missing::
`--if-missing=<action>`::
`--no-if-missing`::
Specify what action will be performed when there is no other
trailer with the same <key> in the input. A setting
provided with '--if-missing' overrides the `trailer.ifMissing` and any
applicable `trailer.<keyAlias>.ifMissing` configuration variables
and applies to all '--trailer' options until the next occurrence of
'--if-missing' or '--no-if-missing'. Upon encountering '--no-if-missing',
clear the effect of any previous use of '--if-missing', such that the relevant
configuration variables are no longer overridden. Possible actions are `doNothing`
or `add`.
trailer with the same _<key>_ in the input. A setting
provided with `--if-missing` overrides the `trailer.ifMissing` and any
applicable `trailer.<key-alias>.ifMissing` 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`.
+
Use `--no-if-missing` to clear the effect of any previous use of
`--if-missing`, such that the relevant configuration variables are no
longer overridden.
--only-trailers::
Output only the trailers, not any other parts of the input.
`--only-trailers`::
`--no-only-trailers`::
Output only the trailers, not any other parts of the
input. The default is `--no-only-trailers`.
--only-input::
`--only-input`::
`--no-only-input`::
Output only trailers that exist in the input; do not add any
from the command-line or by applying `trailer.*` configuration
variables.
from the command-line or by applying `trailer.<key-alias>` configuration
variables. The default is `--no-only-input`.
--unfold::
`--unfold`::
`--no-unfold`::
If a trailer has a value that runs over multiple lines (aka "folded"),
reformat the value into a single line.
reformat the value into a single line. The default is `--no-unfold`.
--parse::
`--parse`::
A convenience alias for `--only-trailers --only-input
--unfold`. 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.
`--unfold`.
+
There is no convenience alias to negate this alias.
--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`).
`--divider`::
`--no-divider`::
Treat `---` as the end of the commit message. This is the default.
Use `--no-divider` when you know your input contains just the
commit message itself (and not an email or the output of
linkgit:git-format-patch[1]).
CONFIGURATION VARIABLES
-----------------------
@@ -193,7 +214,7 @@ include::config/trailer.adoc[]
EXAMPLES
--------
* Configure a 'sign' trailer with a 'Signed-off-by' key, and then
* Configure a `sign` trailer with a `Signed-off-by` key, and then
add two of these trailers to a commit message file:
+
------------
@@ -230,8 +251,8 @@ 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:
* Extract the last commit as a patch, and add a `Cc` and a
`Reviewed-by` trailer to it:
+
------------
$ git format-patch -1
@@ -239,9 +260,9 @@ $ git format-patch -1
$ 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:
* Configure a `sign` trailer with a command to automatically add a
"`Signed-off-by:`{nbsp}" with the author information only if there is no
"`Signed-off-by:`{nbsp}" already, and show how it works:
+
------------
$ cat msg1.txt
@@ -272,7 +293,7 @@ body text
Signed-off-by: Alice <alice@example.com>
------------
* Configure a 'fix' trailer with a key that contains a '#' and no
* Configure a `fix` trailer with a key that contains a `#` and no
space after this character, and show how it works:
+
------------
@@ -284,7 +305,7 @@ subject
Fix #42
------------
* Configure a 'help' trailer with a cmd use a script `glog-find-author`
* Configure a `help` trailer with a cmd use a script `glog-find-author`
which search specified author identity from git log in git repository
and show how it works:
+
@@ -308,7 +329,7 @@ Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Christian Couder <christian.couder@gmail.com>
------------
* Configure a 'ref' trailer with a cmd use a script `glog-grep`
* Configure a `ref` trailer with a cmd use a script `glog-grep`
to grep last relevant commit from git log in the git repository
and show how it works:
+
@@ -331,7 +352,7 @@ body text
Reference-to: 8bc9a0c769 (Add copyright notices., 2005-04-07)
------------
* Configure a 'see' trailer with a command to show the subject of a
* Configure a `see` trailer with a command to show the subject of a
commit that is related, and show how it works:
+
------------
@@ -359,8 +380,8 @@ 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:
git-interpret-trailers(1) to remove trailers with empty values and to
add a `git-version` trailer:
+
------------
$ cat temp.txt

View File

@@ -156,7 +156,7 @@ int cmd_interpret_trailers(int argc,
N_("action if trailer is missing"), option_parse_if_missing),
OPT_BOOL(0, "only-trailers", &opts.only_trailers, N_("output only the trailers")),
OPT_BOOL(0, "only-input", &opts.only_input, N_("do not apply trailer.* configuration variables")),
OPT_BOOL(0, "only-input", &opts.only_input, N_("do not apply trailer.<key-alias> configuration variables")),
OPT_BOOL(0, "unfold", &opts.unfold, N_("reformat multiline trailer values as single-line values")),
OPT_CALLBACK_F(0, "parse", &opts, NULL, N_("alias for --only-trailers --only-input --unfold"),
PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_parse),