Autogenerated manpages for v2.41.0-337-g830b4
[git-manpages.git] / man1 / git-interpret-trailers.1
blob629842d7a2a8ca062e46f18752b3b54df670ab10
1 '\" t
2 .\"     Title: git-interpret-trailers
3 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
4 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
5 .\"      Date: 2023-07-14
6 .\"    Manual: Git Manual
7 .\"    Source: Git 2.41.0.337.g830b4a04c4
8 .\"  Language: English
9 .\"
10 .TH "GIT\-INTERPRET\-TRAILERS" "1" "2023\-07\-14" "Git 2\&.41\&.0\&.337\&.g830b4a" "Git Manual"
11 .\" -----------------------------------------------------------------
12 .\" * Define some portability stuff
13 .\" -----------------------------------------------------------------
14 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 .\" http://bugs.debian.org/507673
16 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
17 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 .ie \n(.g .ds Aq \(aq
19 .el       .ds Aq '
20 .\" -----------------------------------------------------------------
21 .\" * set default formatting
22 .\" -----------------------------------------------------------------
23 .\" disable hyphenation
24 .nh
25 .\" disable justification (adjust text to left margin only)
26 .ad l
27 .\" -----------------------------------------------------------------
28 .\" * MAIN CONTENT STARTS HERE *
29 .\" -----------------------------------------------------------------
30 .SH "NAME"
31 git-interpret-trailers \- Add or parse structured information in commit messages
32 .SH "SYNOPSIS"
33 .sp
34 .nf
35 \fIgit interpret\-trailers\fR [\-\-in\-place] [\-\-trim\-empty]
36                         [(\-\-trailer <token>[(=|:)<value>])\&...]
37                         [\-\-parse] [<file>\&...]
38 .fi
39 .sp
40 .SH "DESCRIPTION"
41 .sp
42 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
43 .sp
44 .if n \{\
45 .RS 4
46 .\}
47 .nf
48 subject
50 Lorem ipsum dolor sit amet, consectetur adipiscing elit\&.
52 Signed\-off\-by: Alice <alice@example\&.com>
53 Signed\-off\-by: Bob <bob@example\&.com>
54 .fi
55 .if n \{\
56 .RE
57 .\}
58 .sp
59 .sp
60 the last two lines starting with "Signed\-off\-by" are trailers\&.
61 .sp
62 This command reads commit messages from either the <file> arguments or the standard input if no <file> is specified\&. If \fB\-\-parse\fR is specified, the output consists of the parsed trailers\&. Otherwise, this command applies the arguments passed using the \fB\-\-trailer\fR option, if any, to each input file\&. The result is emitted on the standard output\&.
63 .sp
64 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\&.
65 .sp
66 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\&.
67 .sp
68 By default, a \fI<token>=<value>\fR or \fI<token>:<value>\fR argument given using \fB\-\-trailer\fR will be appended after the existing trailers only if the last trailer has a different (<token>, <value>) pair (or if there is no existing trailer)\&. The <token> and <value> parts will be trimmed to remove starting and trailing whitespace, and the resulting trimmed <token> and <value> will appear in the output like this:
69 .sp
70 .if n \{\
71 .RS 4
72 .\}
73 .nf
74 token: value
75 .fi
76 .if n \{\
77 .RE
78 .\}
79 .sp
80 .sp
81 This means that the trimmed <token> and <value> will be separated by \fB\*(Aq: \*(Aq\fR (one colon followed by one space)\&. For convenience, the <token> can be a shortened string key (e\&.g\&., "sign") instead of the full string which should appear before the separator on the output (e\&.g\&., "Signed\-off\-by")\&. This can be configured using the \fItrailer\&.<token>\&.key\fR configuration variable\&.
82 .sp
83 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\&.
84 .sp
85 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)\&.
86 .sp
87 When reading trailers, there can be no whitespace before or inside the <token>, but any number of regular space and tab characters are allowed between the <token> 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:
88 .sp
89 .if n \{\
90 .RS 4
91 .\}
92 .nf
93 token: This is a very long value, with spaces and
94   newlines in it\&.
95 .fi
96 .if n \{\
97 .RE
98 .\}
99 .sp
101 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\&.
102 .SH "OPTIONS"
104 \-\-in\-place
105 .RS 4
106 Edit the files in place\&.
109 \-\-trim\-empty
110 .RS 4
111 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\&.
114 \-\-trailer <token>[(=|:)<value>]
115 .RS 4
116 Specify a (<token>, <value>) pair that should be applied as a trailer to the inputs\&. See the description of this command\&.
119 \-\-where <placement>, \-\-no\-where
120 .RS 4
121 Specify where all new trailers will be added\&. A setting provided with
122 \fI\-\-where\fR
123 overrides all configuration variables and applies to all
124 \fI\-\-trailer\fR
125 options until the next occurrence of
126 \fI\-\-where\fR
128 \fI\-\-no\-where\fR\&. Possible values are
129 \fBafter\fR,
130 \fBbefore\fR,
131 \fBend\fR
133 \fBstart\fR\&.
136 \-\-if\-exists <action>, \-\-no\-if\-exists
137 .RS 4
138 Specify what action will be performed when there is already at least one trailer with the same <token> in the input\&. A setting provided with
139 \fI\-\-if\-exists\fR
140 overrides all configuration variables and applies to all
141 \fI\-\-trailer\fR
142 options until the next occurrence of
143 \fI\-\-if\-exists\fR
145 \fI\-\-no\-if\-exists\fR\&. Possible actions are
146 \fBaddIfDifferent\fR,
147 \fBaddIfDifferentNeighbor\fR,
148 \fBadd\fR,
149 \fBreplace\fR
151 \fBdoNothing\fR\&.
154 \-\-if\-missing <action>, \-\-no\-if\-missing
155 .RS 4
156 Specify what action will be performed when there is no other trailer with the same <token> in the input\&. A setting provided with
157 \fI\-\-if\-missing\fR
158 overrides all configuration variables and applies to all
159 \fI\-\-trailer\fR
160 options until the next occurrence of
161 \fI\-\-if\-missing\fR
163 \fI\-\-no\-if\-missing\fR\&. Possible actions are
164 \fBdoNothing\fR
166 \fBadd\fR\&.
169 \-\-only\-trailers
170 .RS 4
171 Output only the trailers, not any other parts of the input\&.
174 \-\-only\-input
175 .RS 4
176 Output only trailers that exist in the input; do not add any from the command\-line or by following configured
177 \fBtrailer\&.*\fR
178 rules\&.
181 \-\-unfold
182 .RS 4
183 Remove any whitespace\-continuation in trailers, so that each trailer appears on a line by itself with its full content\&.
186 \-\-parse
187 .RS 4
188 A convenience alias for
189 \fB\-\-only\-trailers \-\-only\-input \-\-unfold\fR\&.
192 \-\-no\-divider
193 .RS 4
194 Do not treat
195 \fB\-\-\-\fR
196 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
197 \fBgit format\-patch\fR)\&.
199 .SH "CONFIGURATION VARIABLES"
201 trailer\&.separators
202 .RS 4
203 This option tells which characters are recognized as trailer separators\&. By default only
204 \fI:\fR
205 is recognized as a trailer separator, except that
206 \fI=\fR
207 is always accepted on the command line for compatibility with other git commands\&.
209 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\&.
211 For example, if the value for this option is "%=$", then only lines using the format
212 \fI<token><sep><value>\fR
213 with <sep> containing
214 \fI%\fR,
215 \fI=\fR
217 \fI$\fR
218 and then spaces will be considered trailers\&. And
219 \fI%\fR
220 will be the default separator used, so by default trailers will appear like:
221 \fI<token>% <value>\fR
222 (one percent sign and one space will appear between the token and the value)\&.
225 trailer\&.where
226 .RS 4
227 This option tells where a new trailer will be added\&.
229 This can be
230 \fBend\fR, which is the default,
231 \fBstart\fR,
232 \fBafter\fR
234 \fBbefore\fR\&.
236 If it is
237 \fBend\fR, then each new trailer will appear at the end of the existing trailers\&.
239 If it is
240 \fBstart\fR, then each new trailer will appear at the start, instead of the end, of the existing trailers\&.
242 If it is
243 \fBafter\fR, then each new trailer will appear just after the last trailer with the same <token>\&.
245 If it is
246 \fBbefore\fR, then each new trailer will appear just before the first trailer with the same <token>\&.
249 trailer\&.ifexists
250 .RS 4
251 This option makes it possible to choose what action will be performed when there is already at least one trailer with the same <token> in the input\&.
253 The valid values for this option are:
254 \fBaddIfDifferentNeighbor\fR
255 (this is the default),
256 \fBaddIfDifferent\fR,
257 \fBadd\fR,
258 \fBreplace\fR
260 \fBdoNothing\fR\&.
262 With
263 \fBaddIfDifferentNeighbor\fR, a new trailer will be added only if no trailer with the same (<token>, <value>) pair is above or below the line where the new trailer will be added\&.
265 With
266 \fBaddIfDifferent\fR, a new trailer will be added only if no trailer with the same (<token>, <value>) pair is already in the input\&.
268 With
269 \fBadd\fR, a new trailer will be added, even if some trailers with the same (<token>, <value>) pair are already in the input\&.
271 With
272 \fBreplace\fR, an existing trailer with the same <token> will be deleted and the new trailer will be added\&. The deleted trailer will be the closest one (with the same <token>) to the place where the new one will be added\&.
274 With
275 \fBdoNothing\fR, nothing will be done; that is no new trailer will be added if there is already one with the same <token> in the input\&.
278 trailer\&.ifmissing
279 .RS 4
280 This option makes it possible to choose what action will be performed when there is not yet any trailer with the same <token> in the input\&.
282 The valid values for this option are:
283 \fBadd\fR
284 (this is the default) and
285 \fBdoNothing\fR\&.
287 With
288 \fBadd\fR, a new trailer will be added\&.
290 With
291 \fBdoNothing\fR, nothing will be done\&.
294 trailer\&.<token>\&.key
295 .RS 4
296 This
297 \fBkey\fR
298 will be used instead of <token> in the trailer\&. At the end of this key, a separator can appear and then some space characters\&. By default the only valid separator is
299 \fI:\fR, but this can be changed using the
300 \fBtrailer\&.separators\fR
301 config variable\&.
303 If there is a separator, then the key will be used instead of both the <token> and the default separator when adding the trailer\&.
306 trailer\&.<token>\&.where
307 .RS 4
308 This option takes the same values as the
309 \fItrailer\&.where\fR
310 configuration variable and it overrides what is specified by that option for trailers with the specified <token>\&.
313 trailer\&.<token>\&.ifexists
314 .RS 4
315 This option takes the same values as the
316 \fItrailer\&.ifexists\fR
317 configuration variable and it overrides what is specified by that option for trailers with the specified <token>\&.
320 trailer\&.<token>\&.ifmissing
321 .RS 4
322 This option takes the same values as the
323 \fItrailer\&.ifmissing\fR
324 configuration variable and it overrides what is specified by that option for trailers with the specified <token>\&.
327 trailer\&.<token>\&.command
328 .RS 4
329 Deprecated in favor of
330 \fItrailer\&.<token>\&.cmd\fR\&. This option behaves in the same way as
331 \fItrailer\&.<token>\&.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 <value> that would be passed as argument\&.
333 Note that $ARG in the user\(cqs command is only replaced once and that the original way of replacing $ARG is not safe\&.
335 When both
336 \fItrailer\&.<token>\&.cmd\fR
338 \fItrailer\&.<token>\&.command\fR
339 are given for the same <token>,
340 \fItrailer\&.<token>\&.cmd\fR
341 is used and
342 \fItrailer\&.<token>\&.command\fR
343 is ignored\&.
346 trailer\&.<token>\&.cmd
347 .RS 4
348 This option can be used to specify a shell command that will be called once to automatically add a trailer with the specified <token>, and then called each time a
349 \fI\-\-trailer <token>=<value>\fR
350 argument is specified to modify the <value> of the trailer that this option would produce\&.
352 When the specified command is first called to add a trailer with the specified <token>, the behavior is as if a special
353 \fI\-\-trailer <token>=<value>\fR
354 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\&.
356 If some
357 \fI\-\-trailer <token>=<value>\fR
358 arguments are also passed on the command line, the command is called again once for each of these arguments with the same <token>\&. 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
359 \fI\-\-trailer <token>=<value>\fR
360 argument\&.
362 .SH "EXAMPLES"
364 .RS 4
365 .ie n \{\
366 \h'-04'\(bu\h'+03'\c
368 .el \{\
369 .sp -1
370 .IP \(bu 2.3
372 Configure a
373 \fIsign\fR
374 trailer with a
375 \fISigned\-off\-by\fR
376 key, and then add two of these trailers to a commit message file:
378 .if n \{\
379 .RS 4
382 $ git config trailer\&.sign\&.key "Signed\-off\-by"
383 $ cat msg\&.txt
384 subject
386 body text
387 $ git interpret\-trailers \-\-trailer \*(Aqsign: Alice <alice@example\&.com>\*(Aq \-\-trailer \*(Aqsign: Bob <bob@example\&.com>\*(Aq <msg\&.txt
388 subject
390 body text
392 Signed\-off\-by: Alice <alice@example\&.com>
393 Signed\-off\-by: Bob <bob@example\&.com>
395 .if n \{\
401 .RS 4
402 .ie n \{\
403 \h'-04'\(bu\h'+03'\c
405 .el \{\
406 .sp -1
407 .IP \(bu 2.3
409 Use the
410 \fB\-\-in\-place\fR
411 option to edit a commit message file in place:
413 .if n \{\
414 .RS 4
417 $ cat msg\&.txt
418 subject
420 body text
422 Signed\-off\-by: Bob <bob@example\&.com>
423 $ git interpret\-trailers \-\-trailer \*(AqAcked\-by: Alice <alice@example\&.com>\*(Aq \-\-in\-place msg\&.txt
424 $ cat msg\&.txt
425 subject
427 body text
429 Signed\-off\-by: Bob <bob@example\&.com>
430 Acked\-by: Alice <alice@example\&.com>
432 .if n \{\
438 .RS 4
439 .ie n \{\
440 \h'-04'\(bu\h'+03'\c
442 .el \{\
443 .sp -1
444 .IP \(bu 2.3
446 Extract the last commit as a patch, and add a
447 \fICc\fR
448 and a
449 \fIReviewed\-by\fR
450 trailer to it:
452 .if n \{\
453 .RS 4
456 $ git format\-patch \-1
457 0001\-foo\&.patch
458 $ git interpret\-trailers \-\-trailer \*(AqCc: Alice <alice@example\&.com>\*(Aq \-\-trailer \*(AqReviewed\-by: Bob <bob@example\&.com>\*(Aq 0001\-foo\&.patch >0001\-bar\&.patch
460 .if n \{\
466 .RS 4
467 .ie n \{\
468 \h'-04'\(bu\h'+03'\c
470 .el \{\
471 .sp -1
472 .IP \(bu 2.3
474 Configure a
475 \fIsign\fR
476 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:
478 .if n \{\
479 .RS 4
482 $ cat msg1\&.txt
483 subject
485 body text
486 $ git config trailer\&.sign\&.key "Signed\-off\-by: "
487 $ git config trailer\&.sign\&.ifmissing add
488 $ git config trailer\&.sign\&.ifexists doNothing
489 $ git config trailer\&.sign\&.cmd \*(Aqecho "$(git config user\&.name) <$(git config user\&.email)>"\*(Aq
490 $ git interpret\-trailers \-\-trailer sign <msg1\&.txt
491 subject
493 body text
495 Signed\-off\-by: Bob <bob@example\&.com>
496 $ cat msg2\&.txt
497 subject
499 body text
501 Signed\-off\-by: Alice <alice@example\&.com>
502 $ git interpret\-trailers \-\-trailer sign <msg2\&.txt
503 subject
505 body text
507 Signed\-off\-by: Alice <alice@example\&.com>
509 .if n \{\
515 .RS 4
516 .ie n \{\
517 \h'-04'\(bu\h'+03'\c
519 .el \{\
520 .sp -1
521 .IP \(bu 2.3
523 Configure a
524 \fIfix\fR
525 trailer with a key that contains a
526 \fI#\fR
527 and no space after this character, and show how it works:
529 .if n \{\
530 .RS 4
533 $ git config trailer\&.separators ":#"
534 $ git config trailer\&.fix\&.key "Fix #"
535 $ echo "subject" | git interpret\-trailers \-\-trailer fix=42
536 subject
538 Fix #42
540 .if n \{\
546 .RS 4
547 .ie n \{\
548 \h'-04'\(bu\h'+03'\c
550 .el \{\
551 .sp -1
552 .IP \(bu 2.3
554 Configure a
555 \fIhelp\fR
556 trailer with a cmd use a script
557 \fBglog\-find\-author\fR
558 which search specified author identity from git log in git repository and show how it works:
560 .if n \{\
561 .RS 4
564 $ cat ~/bin/glog\-find\-author
565 #!/bin/sh
566 test \-n "$1" && git log \-\-author="$1" \-\-pretty="%an <%ae>" \-1 || true
567 $ cat msg\&.txt
568 subject
570 body text
571 $ git config trailer\&.help\&.key "Helped\-by: "
572 $ git config trailer\&.help\&.ifExists "addIfDifferentNeighbor"
573 $ git config trailer\&.help\&.cmd "~/bin/glog\-find\-author"
574 $ git interpret\-trailers \-\-trailer="help:Junio" \-\-trailer="help:Couder" <msg\&.txt
575 subject
577 body text
579 Helped\-by: Junio C Hamano <gitster@pobox\&.com>
580 Helped\-by: Christian Couder <christian\&.couder@gmail\&.com>
582 .if n \{\
588 .RS 4
589 .ie n \{\
590 \h'-04'\(bu\h'+03'\c
592 .el \{\
593 .sp -1
594 .IP \(bu 2.3
596 Configure a
597 \fIref\fR
598 trailer with a cmd use a script
599 \fBglog\-grep\fR
600 to grep last relevant commit from git log in the git repository and show how it works:
602 .if n \{\
603 .RS 4
606 $ cat ~/bin/glog\-grep
607 #!/bin/sh
608 test \-n "$1" && git log \-\-grep "$1" \-\-pretty=reference \-1 || true
609 $ cat msg\&.txt
610 subject
612 body text
613 $ git config trailer\&.ref\&.key "Reference\-to: "
614 $ git config trailer\&.ref\&.ifExists "replace"
615 $ git config trailer\&.ref\&.cmd "~/bin/glog\-grep"
616 $ git interpret\-trailers \-\-trailer="ref:Add copyright notices\&." <msg\&.txt
617 subject
619 body text
621 Reference\-to: 8bc9a0c769 (Add copyright notices\&., 2005\-04\-07)
623 .if n \{\
629 .RS 4
630 .ie n \{\
631 \h'-04'\(bu\h'+03'\c
633 .el \{\
634 .sp -1
635 .IP \(bu 2.3
637 Configure a
638 \fIsee\fR
639 trailer with a command to show the subject of a commit that is related, and show how it works:
641 .if n \{\
642 .RS 4
645 $ cat msg\&.txt
646 subject
648 body text
650 see: HEAD~2
651 $ cat ~/bin/glog\-ref
652 #!/bin/sh
653 git log \-1 \-\-oneline \-\-format="%h (%s)" \-\-abbrev\-commit \-\-abbrev=14
654 $ git config trailer\&.see\&.key "See\-also: "
655 $ git config trailer\&.see\&.ifExists "replace"
656 $ git config trailer\&.see\&.ifMissing "doNothing"
657 $ git config trailer\&.see\&.cmd "glog\-ref"
658 $ git interpret\-trailers \-\-trailer=see <msg\&.txt
659 subject
661 body text
663 See\-also: fe3187489d69c4 (subject of related commit)
665 .if n \{\
671 .RS 4
672 .ie n \{\
673 \h'-04'\(bu\h'+03'\c
675 .el \{\
676 .sp -1
677 .IP \(bu 2.3
679 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
680 \fIgit interpret\-trailers\fR
681 to remove trailers with empty values and to add a
682 \fIgit\-version\fR
683 trailer:
685 .if n \{\
686 .RS 4
689 $ cat temp\&.txt
690 ***subject***
692 ***message***
694 Fixes: Z
695 Cc: Z
696 Reviewed\-by: Z
697 Signed\-off\-by: Z
698 $ sed \-e \*(Aqs/ Z$/ /\*(Aq temp\&.txt > commit_template\&.txt
699 $ git config commit\&.template commit_template\&.txt
700 $ cat \&.git/hooks/commit\-msg
701 #!/bin/sh
702 git interpret\-trailers \-\-trim\-empty \-\-trailer "git\-version: \e$(git describe)" "\e$1" > "\e$1\&.new"
703 mv "\e$1\&.new" "\e$1"
704 $ chmod +x \&.git/hooks/commit\-msg
706 .if n \{\
711 .SH "SEE ALSO"
713 \fBgit-commit\fR(1), \fBgit-format-patch\fR(1), \fBgit-config\fR(1)
714 .SH "GIT"
716 Part of the \fBgit\fR(1) suite