|
| 1 | +git-interpret-trailers(1) |
| 2 | +========================= |
| 3 | + |
| 4 | +NAME |
| 5 | +---- |
| 6 | +git-interpret-trailers - help add stuctured information into commit messages |
| 7 | + |
| 8 | +SYNOPSIS |
| 9 | +-------- |
| 10 | +[verse] |
| 11 | +'git interpret-trailers' [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...] |
| 12 | + |
| 13 | +DESCRIPTION |
| 14 | +----------- |
| 15 | +Help adding 'trailers' lines, that look similar to RFC 822 e-mail |
| 16 | +headers, at the end of the otherwise free-form part of a commit |
| 17 | +message. |
| 18 | + |
| 19 | +This command reads some patches or commit messages from either the |
| 20 | +<file> arguments or the standard input if no <file> is specified. Then |
| 21 | +this command applies the arguments passed using the `--trailer` |
| 22 | +option, if any, to the commit message part of each input file. The |
| 23 | +result is emitted on the standard output. |
| 24 | + |
| 25 | +Some configuration variables control the way the `--trailer` arguments |
| 26 | +are applied to each commit message and the way any existing trailer in |
| 27 | +the commit message is changed. They also make it possible to |
| 28 | +automatically add some trailers. |
| 29 | + |
| 30 | +By default, a '<token>=<value>' or '<token>:<value>' argument given |
| 31 | +using `--trailer` will be appended after the existing trailers only if |
| 32 | +the last trailer has a different (<token>, <value>) pair (or if there |
| 33 | +is no existing trailer). The <token> and <value> parts will be trimmed |
| 34 | +to remove starting and trailing whitespace, and the resulting trimmed |
| 35 | +<token> and <value> will appear in the message like this: |
| 36 | + |
| 37 | +------------------------------------------------ |
| 38 | +token: value |
| 39 | +------------------------------------------------ |
| 40 | + |
| 41 | +This means that the trimmed <token> and <value> will be separated by |
| 42 | +`': '` (one colon followed by one space). |
| 43 | + |
| 44 | +By default the new trailer will appear at the end of all the existing |
| 45 | +trailers. If there is no existing trailer, the new trailer will appear |
| 46 | +after the commit message part of the ouput, and, if there is no line |
| 47 | +with only spaces at the end of the commit message part, one blank line |
| 48 | +will be added before the new trailer. |
| 49 | + |
| 50 | +Existing trailers are extracted from the input message by looking for |
| 51 | +a group of one or more lines that contain a colon (by default), where |
| 52 | +the group is preceded by one or more empty (or whitespace-only) lines. |
| 53 | +The group must either be at the end of the message or be the last |
| 54 | +non-whitespace lines before a line that starts with '---'. Such three |
| 55 | +minus signs start the patch part of the message. |
| 56 | + |
| 57 | +When reading trailers, there can be whitespaces before and after the |
| 58 | +token, the separator and the value. There can also be whitespaces |
| 59 | +indide the token and the value. |
| 60 | + |
| 61 | +Note that 'trailers' do not follow and are not intended to follow many |
| 62 | +rules for RFC 822 headers. For example they do not follow the line |
| 63 | +folding rules, the encoding rules and probably many other rules. |
| 64 | + |
| 65 | +OPTIONS |
| 66 | +------- |
| 67 | +--trim-empty:: |
| 68 | + If the <value> part of any trailer contains only whitespace, |
| 69 | + the whole trailer will be removed from the resulting message. |
| 70 | + This apply to existing trailers as well as new trailers. |
| 71 | + |
| 72 | +--trailer <token>[(=|:)<value>]:: |
| 73 | + Specify a (<token>, <value>) pair that should be applied as a |
| 74 | + trailer to the input messages. See the description of this |
| 75 | + command. |
| 76 | + |
| 77 | +CONFIGURATION VARIABLES |
| 78 | +----------------------- |
| 79 | + |
| 80 | +trailer.separators:: |
| 81 | + This option tells which characters are recognized as trailer |
| 82 | + separators. By default only ':' is recognized as a trailer |
| 83 | + separator, except that '=' is always accepted on the command |
| 84 | + line for compatibility with other git commands. |
| 85 | ++ |
| 86 | +The first character given by this option will be the default character |
| 87 | +used when another separator is not specified in the config for this |
| 88 | +trailer. |
| 89 | ++ |
| 90 | +For example, if the value for this option is "%=$", then only lines |
| 91 | +using the format '<token><sep><value>' with <sep> containing '%', '=' |
| 92 | +or '$' and then spaces will be considered trailers. And '%' will be |
| 93 | +the default separator used, so by default trailers will appear like: |
| 94 | +'<token>% <value>' (one percent sign and one space will appear between |
| 95 | +the token and the value). |
| 96 | + |
| 97 | +trailer.where:: |
| 98 | + This option tells where a new trailer will be added. |
| 99 | ++ |
| 100 | +This can be `end`, which is the default, `start`, `after` or `before`. |
| 101 | ++ |
| 102 | +If it is `end`, then each new trailer will appear at the end of the |
| 103 | +existing trailers. |
| 104 | ++ |
| 105 | +If it is `start`, then each new trailer will appear at the start, |
| 106 | +instead of the end, of the existing trailers. |
| 107 | ++ |
| 108 | +If it is `after`, then each new trailer will appear just after the |
| 109 | +last trailer with the same <token>. |
| 110 | ++ |
| 111 | +If it is `before`, then each new trailer will appear just before the |
| 112 | +first trailer with the same <token>. |
| 113 | + |
| 114 | +trailer.ifexists:: |
| 115 | + This option makes it possible to choose what action will be |
| 116 | + performed when there is already at least one trailer with the |
| 117 | + same <token> in the message. |
| 118 | ++ |
| 119 | +The valid values for this option are: `addIfDifferentNeighbor` (this |
| 120 | +is the default), `addIfDifferent`, `add`, `overwrite` or `doNothing`. |
| 121 | ++ |
| 122 | +With `addIfDifferentNeighbor`, a new trailer will be added only if no |
| 123 | +trailer with the same (<token>, <value>) pair is above or below the line |
| 124 | +where the new trailer will be added. |
| 125 | ++ |
| 126 | +With `addIfDifferent`, a new trailer will be added only if no trailer |
| 127 | +with the same (<token>, <value>) pair is already in the message. |
| 128 | ++ |
| 129 | +With `add`, a new trailer will be added, even if some trailers with |
| 130 | +the same (<token>, <value>) pair are already in the message. |
| 131 | ++ |
| 132 | +With `replace`, an existing trailer with the same <token> will be |
| 133 | +deleted and the new trailer will be added. The deleted trailer will be |
| 134 | +the closest one (with the same <token>) to the place where the new one |
| 135 | +will be added. |
| 136 | ++ |
| 137 | +With `doNothing`, nothing will be done; that is no new trailer will be |
| 138 | +added if there is already one with the same <token> in the message. |
| 139 | + |
| 140 | +trailer.ifmissing:: |
| 141 | + This option makes it possible to choose what action will be |
| 142 | + performed when there is not yet any trailer with the same |
| 143 | + <token> in the message. |
| 144 | ++ |
| 145 | +The valid values for this option are: `add` (this is the default) and |
| 146 | +`doNothing`. |
| 147 | ++ |
| 148 | +With `add`, a new trailer will be added. |
| 149 | ++ |
| 150 | +With `doNothing`, nothing will be done. |
| 151 | + |
| 152 | +trailer.<token>.key:: |
| 153 | + This `key` will be used instead of <token> in the trailer. At |
| 154 | + the end of this key, a separator can appear and then some |
| 155 | + space characters. By default the only valid separator is ':', |
| 156 | + but this can be changed using the `trailer.separators` config |
| 157 | + variable. |
| 158 | ++ |
| 159 | +If there is a separator, then the key will be used instead of both the |
| 160 | +<token> and the default separator when adding the trailer. |
| 161 | + |
| 162 | +trailer.<token>.where:: |
| 163 | + This option takes the same values as the 'trailer.where' |
| 164 | + configuration variable and it overrides what is specified by |
| 165 | + that option for trailers with the specified <token>. |
| 166 | + |
| 167 | +trailer.<token>.ifexist:: |
| 168 | + This option takes the same values as the 'trailer.ifexist' |
| 169 | + configuration variable and it overrides what is specified by |
| 170 | + that option for trailers with the specified <token>. |
| 171 | + |
| 172 | +trailer.<token>.ifmissing:: |
| 173 | + This option takes the same values as the 'trailer.ifmissing' |
| 174 | + configuration variable and it overrides what is specified by |
| 175 | + that option for trailers with the specified <token>. |
| 176 | + |
| 177 | +trailer.<token>.command:: |
| 178 | + This option can be used to specify a shell command that will |
| 179 | + be called to automatically add or modify a trailer with the |
| 180 | + specified <token>. |
| 181 | ++ |
| 182 | +When this option is specified, the behavior is as if a special |
| 183 | +'<token>=<value>' argument were added at the beginning of the command |
| 184 | +line, where <value> is taken to be the standard output of the |
| 185 | +specified command with any leading and trailing whitespace trimmed |
| 186 | +off. |
| 187 | ++ |
| 188 | +If the command contains the `$ARG` string, this string will be |
| 189 | +replaced with the <value> part of an existing trailer with the same |
| 190 | +<token>, if any, before the command is launched. |
| 191 | ++ |
| 192 | +If some '<token>=<value>' arguments are also passed on the command |
| 193 | +line, when a 'trailer.<token>.command' is configured, the command will |
| 194 | +also be executed for each of these arguments. And the <value> part of |
| 195 | +these arguments, if any, will be used to replace the `$ARG` string in |
| 196 | +the command. |
| 197 | + |
| 198 | +EXAMPLES |
| 199 | +-------- |
| 200 | + |
| 201 | +* Configure a 'sign' trailer with a 'Signed-off-by' key, and then |
| 202 | + add two of these trailers to a message: |
| 203 | ++ |
| 204 | +------------ |
| 205 | +$ git config trailer.sign.key "Signed-off-by" |
| 206 | +$ cat msg.txt |
| 207 | +subject |
| 208 | + |
| 209 | +message |
| 210 | +$ cat msg.txt | git interpret-trailers --trailer 'sign: Alice < [email protected]>' --trailer 'sign: Bob < [email protected]>' |
| 211 | +subject |
| 212 | + |
| 213 | +message |
| 214 | + |
| 215 | +Signed-off-by: Alice < [email protected]> |
| 216 | +Signed-off-by: Bob < [email protected]> |
| 217 | +------------ |
| 218 | + |
| 219 | +* Extract the last commit as a patch, and add a 'Cc' and a |
| 220 | + 'Reviewed-by' trailer to it: |
| 221 | ++ |
| 222 | +------------ |
| 223 | +$ git format-patch -1 |
| 224 | +0001-foo.patch |
| 225 | +$ git interpret-trailers --trailer 'Cc: Alice < [email protected]>' --trailer 'Reviewed-by: Bob < [email protected]>' 0001-foo.patch >0001-bar.patch |
| 226 | +------------ |
| 227 | + |
| 228 | +* Configure a 'sign' trailer with a command to automatically add a |
| 229 | + 'Signed-off-by: ' with the author information only if there is no |
| 230 | + 'Signed-off-by: ' already, and show how it works: |
| 231 | ++ |
| 232 | +------------ |
| 233 | +$ git config trailer.sign.key "Signed-off-by: " |
| 234 | +$ git config trailer.sign.ifmissing add |
| 235 | +$ git config trailer.sign.ifexists doNothing |
| 236 | +$ git config trailer.sign.command 'echo "$(git config user.name) <$(git config user.email)>"' |
| 237 | +$ git interpret-trailers <<EOF |
| 238 | +> EOF |
| 239 | + |
| 240 | +Signed-off-by: Bob < [email protected]> |
| 241 | +$ git interpret-trailers <<EOF |
| 242 | +> Signed-off-by: Alice < [email protected]> |
| 243 | +> EOF |
| 244 | + |
| 245 | +Signed-off-by: Alice < [email protected]> |
| 246 | +------------ |
| 247 | + |
| 248 | +* Configure a 'fix' trailer with a key that contains a '#' and no |
| 249 | + space after this character, and show how it works: |
| 250 | ++ |
| 251 | +------------ |
| 252 | +$ git config trailer.separators ":#" |
| 253 | +$ git config trailer.fix.key "Fix #" |
| 254 | +$ echo "subject" | git interpret-trailers --trailer fix=42 |
| 255 | +subject |
| 256 | + |
| 257 | +Fix #42 |
| 258 | +------------ |
| 259 | + |
| 260 | +* Configure a 'see' trailer with a command to show the subject of a |
| 261 | + commit that is related, and show how it works: |
| 262 | ++ |
| 263 | +------------ |
| 264 | +$ git config trailer.see.key "See-also: " |
| 265 | +$ git config trailer.see.ifExists "replace" |
| 266 | +$ git config trailer.see.ifMissing "doNothing" |
| 267 | +$ git config trailer.see.command "git log -1 --oneline --format=\"%h (%s)\" --abbrev-commit --abbrev=14 \$ARG" |
| 268 | +$ git interpret-trailers <<EOF |
| 269 | +> subject |
| 270 | +> |
| 271 | +> message |
| 272 | +> |
| 273 | +> see: HEAD~2 |
| 274 | +> EOF |
| 275 | +subject |
| 276 | + |
| 277 | +message |
| 278 | + |
| 279 | +See-also: fe3187489d69c4 (subject of related commit) |
| 280 | +------------ |
| 281 | + |
| 282 | +* Configure a commit template with some trailers with empty values |
| 283 | + (using sed to show and keep the trailing spaces at the end of the |
| 284 | + trailers), then configure a commit-msg hook that uses |
| 285 | + 'git interpret-trailers' to remove trailers with empty values and |
| 286 | + to add a 'git-version' trailer: |
| 287 | ++ |
| 288 | +------------ |
| 289 | +$ sed -e 's/ Z$/ /' >commit_template.txt <<EOF |
| 290 | +> ***subject*** |
| 291 | +> |
| 292 | +> ***message*** |
| 293 | +> |
| 294 | +> Fixes: Z |
| 295 | +> Cc: Z |
| 296 | +> Reviewed-by: Z |
| 297 | +> Signed-off-by: Z |
| 298 | +> EOF |
| 299 | +$ git config commit.template commit_template.txt |
| 300 | +$ cat >.git/hooks/commit-msg <<EOF |
| 301 | +> #!/bin/sh |
| 302 | +> git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new" |
| 303 | +> mv "\$1.new" "\$1" |
| 304 | +> EOF |
| 305 | +$ chmod +x .git/hooks/commit-msg |
| 306 | +------------ |
| 307 | + |
| 308 | +SEE ALSO |
| 309 | +-------- |
| 310 | +linkgit:git-commit[1], linkgit:git-format-patch[1], linkgit:git-config[1] |
| 311 | + |
| 312 | +GIT |
| 313 | +--- |
| 314 | +Part of the linkgit:git[1] suite |
0 commit comments