| git-interpret-trailers(1) | |
| ========================= | |
| NAME | |
| ---- | |
| git-interpret-trailers - Add or parse metadata in commit messages | |
| SYNOPSIS | |
| -------- | |
| [synopsis] | |
| git interpret-trailers [--in-place] [--trim-empty] | |
| [(--trailer (<key>|<key-alias>)[(=|:)<value>])...] | |
| [--parse] [<file>...] | |
| DESCRIPTION | |
| ----------- | |
| Add or parse trailer metadata at the end of the otherwise | |
| free-form part of a commit message, or any other kind of text. | |
| A _trailer_ in its simplest form is a key-value pair with a colon as a | |
| separator. The _key_ consists of ASCII alphanumeric characters and | |
| hyphens (`-`). A _trailer block_ consists of one or more trailers. The | |
| trailer block needs to be preceded by a blank line, where a _blank line_ | |
| is either an empty or a whitespace-only line. For example, in the | |
| following commit message | |
| ------------------------------------------------ | |
| subject | |
| Lorem ipsum dolor sit amet, consectetur adipiscing elit. | |
| 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. | |
| This command reads 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 | |
| coming from the input, without influencing them with any command line | |
| options or configuration variables. | |
| 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. | |
| 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. | |
| Some configuration variables control the way the `--trailer` 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. | |
| Let's consider new trailers added with `--trailer`. | |
| By default, the new trailer will appear at the end of the trailer block. | |
| Also by default, this new trailer will only be added | |
| if the last trailer is different to it. | |
| A trailer block will be created with only that trailer if a trailer | |
| block does not already exist. Recall that a trailer block needs to be | |
| preceded by a blank line, so a blank line will be inserted before the | |
| new trailer block in that case. | |
| This is how the new trailer is added: a `<key>=<value>` or | |
| `<key>:<value>` argument given using `--trailer` will be appended after | |
| the existing trailers. 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: value | |
| ------------------------------------------------ | |
| This means that the trimmed _<key>_ and _<value>_ will be separated by | |
| "`:`{nbsp}" (one colon followed by one space). | |
| Existing trailers are extracted from the input by looking for the | |
| trailer block. A trailer block is 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 trailer block is by definition at the end of the commit message. | |
| The message in turn is either (i) at the end of the input, or (ii) the | |
| last non-whitespace lines before a line that starts with `---` (followed | |
| by a space or the end of the line). | |
| 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 _<key-alias>_ must be a prefix | |
| of the full _<key>_ string, although case sensitivity does not matter. For | |
| example, if you have | |
| ------------------------------------------------ | |
| trailer.sign.key "Signed-off-by: " | |
| ------------------------------------------------ | |
| in your configuration, you only need to specify `--trailer="sign: foo"` | |
| on the command line instead of `--trailer="Signed-off-by: foo"`. | |
| 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 | |
| with each subsequent line starting with at least one whitespace, like | |
| the "folding" in RFC 822. Example: | |
| ------------------------------------------------ | |
| key: This is a very long value, with spaces and | |
| newlines in it. | |
| ------------------------------------------------ | |
| OTHER RULES | |
| ----------- | |
| What was covered in the previous section are the rules that are relevant | |
| for regular use. The following points are included for completeness. | |
| -- | |
| * This command ignores comment lines (see `core.commentString` in | |
| linkgit:git-config[1]). This is for use with the `prepare-commit-msg` | |
| and `commit-msg` hooks. | |
| * Candidate trailer lines that have `:` as the separator, that have no | |
| whitespace before the value part, and that start with `//` are not | |
| recognized as trailers. This is to avoid accidentally interpreting | |
| URLs as trailers (e.g. lines that start with `https://`). | |
| -- | |
| OPTIONS | |
| ------- | |
| `--in-place`:: | |
| `--no-in-place`:: | |
| Edit the files in place. The default is `--no-in-place`. | |
| `--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>]`:: | |
| `--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`:: | |
| Specify where all new trailers will be added. A setting | |
| 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`:: | |
| 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.<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`:: | |
| 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.<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`:: | |
| `--no-only-trailers`:: | |
| Output only the trailers, not any other parts of the | |
| input. The default is `--no-only-trailers`. | |
| `--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.<key-alias>` configuration | |
| variables. The default is `--no-only-input`. | |
| `--unfold`:: | |
| `--no-unfold`:: | |
| If a trailer has a value that runs over multiple lines (aka "folded"), | |
| reformat the value into a single line. The default is `--no-unfold`. | |
| `--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`. | |
| + | |
| There is no convenience alias to negate this alias. | |
| `--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 | |
| ----------------------- | |
| include::includes/cmd-config-section-all.adoc[] | |
| include::config/trailer.adoc[] | |
| EXAMPLES | |
| -------- | |
| * Configure a `sign` trailer with a `Signed-off-by` key, and then | |
| add two of these trailers to a commit message file: | |
| + | |
| ------------ | |
| $ git config trailer.sign.key "Signed-off-by" | |
| $ cat msg.txt | |
| subject | |
| body text | |
| $ git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>' <msg.txt | |
| subject | |
| body text | |
| Signed-off-by: Alice <alice@example.com> | |
| Signed-off-by: Bob <bob@example.com> | |
| ------------ | |
| * Use the `--in-place` option to edit a commit message file in place: | |
| + | |
| ------------ | |
| $ cat msg.txt | |
| subject | |
| body text | |
| 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 | |
| body text | |
| 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:`{nbsp}" with the author information only if there is no | |
| "`Signed-off-by:`{nbsp}" already, and show how it works: | |
| + | |
| ------------ | |
| $ 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 'echo "$(git config user.name) <$(git config user.email)>"' | |
| $ 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> | |
| ------------ | |
| * 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 `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: | |
| + | |
| ------------ | |
| $ 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> | |
| ------------ | |
| * 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: | |
| + | |
| ------------ | |
| $ 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) | |
| ------------ | |
| * Configure a `see` trailer with a command to show the subject of a | |
| commit that is related, and show how it works: | |
| + | |
| ------------ | |
| $ 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) | |
| ------------ | |
| * 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 `git-version` trailer: | |
| + | |
| ------------ | |
| $ cat temp.txt | |
| ***subject*** | |
| ***message*** | |
| Fixes: Z | |
| Cc: Z | |
| Reviewed-by: Z | |
| Signed-off-by: Z | |
| $ sed -e 's/ Z$/ /' 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: \$(git describe)" "\$1" > "\$1.new" | |
| mv "\$1.new" "\$1" | |
| $ chmod +x .git/hooks/commit-msg | |
| ------------ | |
| * Here we try to use three different trailer keys. But it fails because | |
| two of them are not recognized as trailer keys. | |
| + | |
| ---- | |
| $ cat msg.txt | |
| subject | |
| Skapad-på: some-branch | |
| Hash-in-v6.11: 45c12d3269fe48f22834320c782ffe86c3560f2c | |
| Reviewed-by: Alice <alice@example.com> | |
| $ git interpret-trailers --only-trailers <msg.txt | |
| $ | |
| ---- | |
| + | |
| Recall that a trailer key has to consist of only ASCII alphanumeric | |
| characters and hyphens, and this does not hold for the two first | |
| supposed trailer keys. And now none are recognized as trailers because | |
| the candidate trailer block has at least one non-trailer line, even | |
| though `Reviewed-by` is a valid trailer key. Recall that a trailer block | |
| has to either (i) be all trailers, or (ii) consist of at least one | |
| Git-generated or user-configured trailer (and some other conditions). | |
| And (ii) is not satisfied since we have not configured any trailer keys. | |
| SEE ALSO | |
| -------- | |
| linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1] | |
| GIT | |
| --- | |
| Part of the linkgit:git[1] suite |