Documentation: add documentation for 'git interpret-trailers'
While at it add git-interpret-trailers to "command-list.txt". Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									b9384ff34e
								
							
						
					
					
						commit
						dfd66ddf5a
					
				|  | @ -0,0 +1,314 @@ | ||||||
|  | git-interpret-trailers(1) | ||||||
|  | ========================= | ||||||
|  |  | ||||||
|  | NAME | ||||||
|  | ---- | ||||||
|  | git-interpret-trailers - help add stuctured information into commit messages | ||||||
|  |  | ||||||
|  | SYNOPSIS | ||||||
|  | -------- | ||||||
|  | [verse] | ||||||
|  | 'git interpret-trailers' [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...] | ||||||
|  |  | ||||||
|  | DESCRIPTION | ||||||
|  | ----------- | ||||||
|  | Help adding 'trailers' lines, that look similar to RFC 822 e-mail | ||||||
|  | headers, at the end of the otherwise free-form part of a commit | ||||||
|  | message. | ||||||
|  |  | ||||||
|  | This command reads some patches or commit messages from either the | ||||||
|  | <file> arguments or the standard input if no <file> is specified. Then | ||||||
|  | this command applies the arguments passed using the `--trailer` | ||||||
|  | option, if any, to the commit message part of each input file. The | ||||||
|  | result is emitted on the standard output. | ||||||
|  |  | ||||||
|  | Some configuration variables control the way the `--trailer` arguments | ||||||
|  | are applied to each commit message and the way any existing trailer in | ||||||
|  | the commit message is changed. They also make it possible to | ||||||
|  | automatically add some trailers. | ||||||
|  |  | ||||||
|  | By default, a '<token>=<value>' or '<token>:<value>' argument given | ||||||
|  | using `--trailer` 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 message like this: | ||||||
|  |  | ||||||
|  | ------------------------------------------------ | ||||||
|  | token: value | ||||||
|  | ------------------------------------------------ | ||||||
|  |  | ||||||
|  | This means that the trimmed <token> and <value> will be separated by | ||||||
|  | `': '` (one colon followed by one space). | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | after the commit message part of the ouput, and, if there is no line | ||||||
|  | with only spaces at the end of the commit message part, one blank line | ||||||
|  | will be added before the new trailer. | ||||||
|  |  | ||||||
|  | Existing trailers are extracted from the input message by looking for | ||||||
|  | a group of one or more lines that contain a colon (by default), where | ||||||
|  | the group is preceded by one or more empty (or whitespace-only) lines. | ||||||
|  | The group must either be at the end of the message or be the last | ||||||
|  | non-whitespace lines before a line that starts with '---'. Such three | ||||||
|  | minus signs start the patch part of the message. | ||||||
|  |  | ||||||
|  | When reading trailers, there can be whitespaces before and after the | ||||||
|  | token, the separator and the value. There can also be whitespaces | ||||||
|  | indide the token and the value. | ||||||
|  |  | ||||||
|  | Note that 'trailers' do not follow and are not intended to follow many | ||||||
|  | rules for RFC 822 headers. For example they do not follow the line | ||||||
|  | folding rules, the encoding rules and probably many other rules. | ||||||
|  |  | ||||||
|  | OPTIONS | ||||||
|  | ------- | ||||||
|  | --trim-empty:: | ||||||
|  | 	If the <value> part of any trailer contains only whitespace, | ||||||
|  | 	the whole trailer will be removed from the resulting message. | ||||||
|  | 	This apply to existing trailers as well as new trailers. | ||||||
|  |  | ||||||
|  | --trailer <token>[(=|:)<value>]:: | ||||||
|  | 	Specify a (<token>, <value>) pair that should be applied as a | ||||||
|  | 	trailer to the input messages. See the description of this | ||||||
|  | 	command. | ||||||
|  |  | ||||||
|  | CONFIGURATION VARIABLES | ||||||
|  | ----------------------- | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | 	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 '<token><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: | ||||||
|  | '<token>% <value>' (one percent sign and one space will appear between | ||||||
|  | the token and the value). | ||||||
|  |  | ||||||
|  | trailer.where:: | ||||||
|  | 	This option tells where a new trailer will be added. | ||||||
|  | + | ||||||
|  | This can be `end`, which is the default, `start`, `after` or `before`. | ||||||
|  | + | ||||||
|  | If it is `end`, then each new trailer will appear at the end of the | ||||||
|  | existing trailers. | ||||||
|  | + | ||||||
|  | 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 <token>. | ||||||
|  | + | ||||||
|  | If it is `before`, then each new trailer will appear just before the | ||||||
|  | first trailer with the same <token>. | ||||||
|  |  | ||||||
|  | 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 <token> in the message. | ||||||
|  | + | ||||||
|  | The valid values for this option are: `addIfDifferentNeighbor` (this | ||||||
|  | is the default), `addIfDifferent`, `add`, `overwrite` or `doNothing`. | ||||||
|  | + | ||||||
|  | With `addIfDifferentNeighbor`, 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. | ||||||
|  | + | ||||||
|  | With `addIfDifferent`, a new trailer will be added only if no trailer | ||||||
|  | with the same (<token>, <value>) pair is already in the message. | ||||||
|  | + | ||||||
|  | With `add`, a new trailer will be added, even if some trailers with | ||||||
|  | the same (<token>, <value>) pair are already in the message. | ||||||
|  | + | ||||||
|  | With `replace`, 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. | ||||||
|  | + | ||||||
|  | With `doNothing`, nothing will be done; that is no new trailer will be | ||||||
|  | added if there is already one with the same <token> in the message. | ||||||
|  |  | ||||||
|  | trailer.ifmissing:: | ||||||
|  | 	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 message. | ||||||
|  | + | ||||||
|  | The valid values for this option are: `add` (this is the default) and | ||||||
|  | `doNothing`. | ||||||
|  | + | ||||||
|  | With `add`, a new trailer will be added. | ||||||
|  | + | ||||||
|  | With `doNothing`, nothing will be done. | ||||||
|  |  | ||||||
|  | trailer.<token>.key:: | ||||||
|  | 	This `key` 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 ':', | ||||||
|  | 	but this can be changed using the `trailer.separators` config | ||||||
|  | 	variable. | ||||||
|  | + | ||||||
|  | If there is a separator, then the key will be used instead of both the | ||||||
|  | <token> and the default separator when adding the trailer. | ||||||
|  |  | ||||||
|  | trailer.<token>.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 <token>. | ||||||
|  |  | ||||||
|  | trailer.<token>.ifexist:: | ||||||
|  | 	This option takes the same values as the 'trailer.ifexist' | ||||||
|  | 	configuration variable and it overrides what is specified by | ||||||
|  | 	that option for trailers with the specified <token>. | ||||||
|  |  | ||||||
|  | trailer.<token>.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 <token>. | ||||||
|  |  | ||||||
|  | trailer.<token>.command:: | ||||||
|  | 	This option can be used to specify a shell command that will | ||||||
|  | 	be called to automatically add or modify a trailer with the | ||||||
|  | 	specified <token>. | ||||||
|  | + | ||||||
|  | When this option is specified, the behavior is as if a special | ||||||
|  | '<token>=<value>' argument were added at the beginning of the command | ||||||
|  | line, where <value> is taken to be the standard output of the | ||||||
|  | specified command with any leading and trailing whitespace trimmed | ||||||
|  | off. | ||||||
|  | + | ||||||
|  | If the command contains the `$ARG` string, this string will be | ||||||
|  | replaced with the <value> part of an existing trailer with the same | ||||||
|  | <token>, if any, before the command is launched. | ||||||
|  | + | ||||||
|  | If some '<token>=<value>' arguments are also passed on the command | ||||||
|  | line, when a 'trailer.<token>.command' is configured, the command will | ||||||
|  | also be executed for each of these arguments. And the <value> part of | ||||||
|  | these arguments, if any, will be used to replace the `$ARG` string in | ||||||
|  | the command. | ||||||
|  |  | ||||||
|  | EXAMPLES | ||||||
|  | -------- | ||||||
|  |  | ||||||
|  | * Configure a 'sign' trailer with a 'Signed-off-by' key, and then | ||||||
|  |   add two of these trailers to a message: | ||||||
|  | + | ||||||
|  | ------------ | ||||||
|  | $ git config trailer.sign.key "Signed-off-by" | ||||||
|  | $ cat msg.txt | ||||||
|  | subject | ||||||
|  |  | ||||||
|  | message | ||||||
|  | $ cat msg.txt | git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>' | ||||||
|  | subject | ||||||
|  |  | ||||||
|  | message | ||||||
|  |  | ||||||
|  | Signed-off-by: Alice <alice@example.com> | ||||||
|  | Signed-off-by: Bob <bob@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: ' with the author information only if there is no | ||||||
|  |   'Signed-off-by: ' already, and show how it works: | ||||||
|  | + | ||||||
|  | ------------ | ||||||
|  | $ git config trailer.sign.key "Signed-off-by: " | ||||||
|  | $ git config trailer.sign.ifmissing add | ||||||
|  | $ git config trailer.sign.ifexists doNothing | ||||||
|  | $ git config trailer.sign.command 'echo "$(git config user.name) <$(git config user.email)>"' | ||||||
|  | $ git interpret-trailers <<EOF | ||||||
|  | > EOF | ||||||
|  |  | ||||||
|  | Signed-off-by: Bob <bob@example.com> | ||||||
|  | $ git interpret-trailers <<EOF | ||||||
|  | > Signed-off-by: Alice <alice@example.com> | ||||||
|  | > EOF | ||||||
|  |  | ||||||
|  | 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 'see' trailer with a command to show the subject of a | ||||||
|  |   commit that is related, and show how it works: | ||||||
|  | + | ||||||
|  | ------------ | ||||||
|  | $ git config trailer.see.key "See-also: " | ||||||
|  | $ git config trailer.see.ifExists "replace" | ||||||
|  | $ git config trailer.see.ifMissing "doNothing" | ||||||
|  | $ git config trailer.see.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" | ||||||
|  | $ git interpret-trailers <<EOF | ||||||
|  | > subject | ||||||
|  | >  | ||||||
|  | > message | ||||||
|  | >  | ||||||
|  | > see: HEAD~2 | ||||||
|  | > EOF | ||||||
|  | subject | ||||||
|  |  | ||||||
|  | message | ||||||
|  |  | ||||||
|  | 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: | ||||||
|  | + | ||||||
|  | ------------ | ||||||
|  | $ sed -e 's/ Z$/ /' >commit_template.txt <<EOF | ||||||
|  | > ***subject*** | ||||||
|  | >  | ||||||
|  | > ***message*** | ||||||
|  | >  | ||||||
|  | > Fixes: Z | ||||||
|  | > Cc: Z | ||||||
|  | > Reviewed-by: Z | ||||||
|  | > Signed-off-by: Z | ||||||
|  | > EOF | ||||||
|  | $ git config commit.template commit_template.txt | ||||||
|  | $ cat >.git/hooks/commit-msg <<EOF | ||||||
|  | > #!/bin/sh | ||||||
|  | > git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new" | ||||||
|  | > mv "\$1.new" "\$1" | ||||||
|  | > EOF | ||||||
|  | $ chmod +x .git/hooks/commit-msg | ||||||
|  | ------------ | ||||||
|  |  | ||||||
|  | SEE ALSO | ||||||
|  | -------- | ||||||
|  | linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1] | ||||||
|  |  | ||||||
|  | GIT | ||||||
|  | --- | ||||||
|  | Part of the linkgit:git[1] suite | ||||||
|  | @ -62,6 +62,7 @@ git-imap-send                           foreignscminterface | ||||||
| git-index-pack                          plumbingmanipulators | git-index-pack                          plumbingmanipulators | ||||||
| git-init                                mainporcelain common | git-init                                mainporcelain common | ||||||
| git-instaweb                            ancillaryinterrogators | git-instaweb                            ancillaryinterrogators | ||||||
|  | git-interpret-trailers                  purehelpers | ||||||
| gitk                                    mainporcelain | gitk                                    mainporcelain | ||||||
| git-log                                 mainporcelain common | git-log                                 mainporcelain common | ||||||
| git-ls-files                            plumbinginterrogators | git-ls-files                            plumbinginterrogators | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Christian Couder
						Christian Couder