设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.49.1 → 2.50.1 无更改
-
2.49.0
2025-03-14
- 2.45.1 → 2.48.2 无更改
-
2.45.0
2024-04-29
- 2.43.1 → 2.44.4 无更改
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 无更改
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 无更改
-
2.41.0
2023-06-01
- 2.39.1 → 2.40.4 无更改
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 无更改
-
2.38.0
2022-10-02
- 2.32.1 → 2.37.7 无更改
-
2.32.0
2021-06-06
- 2.22.1 → 2.31.8 无更改
-
2.22.0
2019-06-07
- 2.19.3 → 2.21.4 无更改
-
2.19.2
2018-11-21
- 2.19.1 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 无更改
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 无更改
-
2.13.7
2018-05-22
- 2.12.5 无更改
-
2.11.4
2017-09-22
- 2.10.5 无更改
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 无更改
-
2.6.7
2017-05-05
- 2.3.10 → 2.5.6 无变更
-
2.2.3
2015-09-04
概要
git interpret-trailers [--in-place] [--trim-empty] [(--trailer (<key>|<key-alias>)[(=|:)<value>])…] [--parse] [<file>…]
描述
在提交消息的自由格式部分的末尾,添加或解析与 RFC 822 电子邮件头类似的附注行。例如,在以下提交消息中
subject Lorem ipsum dolor sit amet, consectetur adipiscing elit. Signed-off-by: Alice <alice@example.com> Signed-off-by: Bob <bob@example.com>
最后两行以“Signed-off-by”开头的即为附注行。
此命令从 <file> 参数或标准输入读取提交消息,如果未指定 <file>。如果指定了 --parse
,则输出由来自输入的已解析附注行组成,不受任何命令行选项或配置变量的影响。
否则,此命令会将 trailer.*
配置变量(可能会添加新的附注行,以及重新定位它们),以及任何可以覆盖配置变量的命令行参数(例如 --trailer=...
,它也可以添加新的附注行),应用于每个输入文件。结果将输出到标准输出。
此命令还可以操作 git-format-patch[1] 的输出,它比普通的提交消息更复杂。具体来说,此类输出包括提交消息(如上所述)、一个“---”分隔线和一个补丁部分。对于这些输入,分隔线和补丁部分不会被此命令修改,并按原样输出,除非指定了 --no-divider
。
一些配置变量控制 --trailer
参数应用于每个输入的方式,以及输入中任何现有附注行的更改方式。它们还使得自动添加一些附注行成为可能。
默认情况下,使用 --trailer
给定的 <key>=<value> 或 <key>:<value> 参数,仅当最后一个附注行具有不同的 (<key>, <value>) 对(或者没有现有附注行)时,才会附加到现有附注行之后。<key> 和 <value> 部分将被修剪以去除开头和结尾的空白字符,修剪后的 <key> 和 <value> 将在输出中显示如下
key: value
这意味着修剪后的 <key> 和 <value> 将由 :
(一个冒号后跟一个空格)分隔。
为了方便起见,可以配置一个 <key-alias> 以缩短在命令行上键入 --trailer
的长度。这可以使用 trailer.<key-alias>.key 配置变量进行配置。<keyAlias> 必须是完整 <key> 字符串的前缀,尽管不区分大小写。例如,如果您有
trailer.sign.key "Signed-off-by: "
在您的配置中,您只需在命令行上指定 --trailer="sign:
foo"
,而无需指定 --trailer="Signed-off-by:
foo"
。
默认情况下,新的附注行将出现在所有现有附注行的末尾。如果没有现有附注行,新的附注行将出现在输入的末尾。如果新附注行前面没有空行,则会添加一个空行。
现有附注行通过查找一组一行或多行来从输入中提取,该组行 (i) 全部是附注行,或者 (ii) 包含至少一个 Git 生成的或用户配置的附注行,并且至少由 25% 的附注行组成。该组行之前必须有一行或多行空行(或仅包含空白字符的行)。该组行必须位于输入的末尾,或者是在以 --- 开头(后跟一个空格或行尾)的行之前的最后非空白行。
读取附注行时,<key> 之前或内部不能有空白字符,但 <key> 和分隔符之间允许任意数量的常规空格和制表符。<value> 之前、内部或之后可以有空白字符。<value> 可以分成多行,每后续行都以至少一个空白字符开头,类似于 RFC 822 中的“折叠”。示例
key: This is a very long value, with spaces and newlines in it.
请注意,附注行不遵循(也无意遵循)RFC 822 头部的许多规则。例如,它们不遵循编码规则。
选项
- --in-place
-
就地编辑文件。
- --trim-empty
-
如果任何附注行的 <value> 部分仅包含空白字符,则整个附注行将从输出中删除。这适用于现有附注行和新附注行。
- --trailer <key>[(=|:)<value>]
-
指定一个 (<key>, <value>) 对,应将其作为附注行应用于输入。请参阅此命令的描述。
- --where <placement>
- --no-where
-
指定所有新附注行将添加的位置。使用 --where 提供的设置会覆盖
trailer.where
和任何适用的trailer.
<keyAlias>.where
配置变量,并适用于所有 --trailer 选项,直到下一次出现 --where 或 --no-where。当遇到 --no-where 时,清除之前使用 --where 的效果,使相关配置变量不再被覆盖。可能的位置有after
(之后)、before
(之前)、end
(末尾)或start
(开头)。 - --if-exists <action>
- --no-if-exists
-
指定当输入中已存在至少一个具有相同 <key> 的附注行时将执行的操作。使用 --if-exists 提供的设置会覆盖
trailer.ifExists
和任何适用的trailer.
<keyAlias>.ifExists
配置变量,并适用于所有 --trailer 选项,直到下一次出现 --if-exists 或 --no-if-exists。当遇到 '--no-if-exists 时,清除之前使用 '--if-exists 的效果,使相关配置变量不再被覆盖。可能的动作有addIfDifferent
、addIfDifferentNeighbor
、add
、replace
和doNothing
。 - --if-missing <action>
- --no-if-missing
-
指定当输入中没有其他具有相同 <key> 的附注行时将执行的操作。使用 --if-missing 提供的设置会覆盖
trailer.ifMissing
和任何适用的trailer.
<keyAlias>.ifMissing
配置变量,并适用于所有 --trailer 选项,直到下一次出现 --if-missing 或 --no-if-missing。当遇到 '--no-if-missing 时,清除之前使用 '--if-missing 的效果,使相关配置变量不再被覆盖。可能的动作是doNothing
或add
。 - --only-trailers
-
仅输出附注行,不输出输入的其他任何部分。
- --only-input
-
仅输出输入中存在的附注行;不添加任何来自命令行或通过应用
trailer.*
配置变量的附注行。 - --unfold
-
如果附注行的值跨多行(又称“折叠”),则将该值重新格式化为单行。
- --parse
-
是
--only-trailers
--only-input
--unfold
的一个方便别名。这使得仅查看来自输入的附注行而不会受任何命令行选项或配置变量影响变得更容易,同时通过 --unfold 使输出对机器友好。 - --no-divider
-
不要将
---
视为提交消息的结束。当您知道您的输入仅包含提交消息本身(而不是电子邮件或git
format-patch
的输出)时使用此选项。
配置变量
本节中以下所有内容均从 git-config[1] 文档中选择性地包含。内容与彼处相同:
- trailer.separators
-
此选项指定哪些字符被识别为附注行分隔符。默认情况下,只有 : 被识别为附注行分隔符,但为了与其他 git 命令兼容,命令行上始终接受 =。
此选项指定的第一个字符将是默认字符,当此附注行在配置中未指定其他分隔符时使用。
例如,如果此选项的值为“%=$”,那么只有使用格式 <key><sep><value> 且 <sep> 包含 %、= 或 $,然后是空格的行才会被视为附注行。而 % 将是默认使用的分隔符,因此默认情况下附注行将显示为:<key>% <value>(一个百分号和一个空格将出现在键和值之间)。
- trailer.where
-
此选项指定新附注行将添加的位置。
这可以是默认值
end
(末尾),start
(开头),after
(之后)或before
(之前)。如果是
end
,则每个新附注行将出现在现有附注行的末尾。如果是
start
,则每个新附注行将出现在现有附注行的开头,而不是末尾。如果是
after
,则每个新附注行将出现在具有相同 <key> 的最后一个附注行之后。如果是
before
,则每个新附注行将出现在具有相同 <key> 的第一个附注行之前。 - trailer.ifexists
-
此选项使得在输入中已存在至少一个具有相同 <key> 的附注行时,可以选择要执行的操作。
此选项的有效值包括:
addIfDifferentNeighbor
(这是默认值),addIfDifferent
,add
,replace
或doNothing
。使用
addIfDifferentNeighbor
,只有在新的附注行将被添加的行上方或下方没有具有相同 (<key>, <value>) 对的附注行时,才会添加新的附注行。使用
addIfDifferent
,只有在输入中尚无具有相同 (<key>, <value>) 对的附注行时,才会添加新的附注行。使用
add
,即使输入中已经存在一些具有相同 (<key>, <value>) 对的附注行,也会添加新的附注行。使用
replace
,具有相同 <key> 的现有附注行将被删除,并添加新的附注行。被删除的附注行将是距离新附注行添加位置最近的(具有相同 <key> 的)附注行。使用
doNothing
,将不执行任何操作;也就是说,如果输入中已经存在一个具有相同 <key> 的附注行,则不会添加新的附注行。 - trailer.ifmissing
-
此选项使得在输入中尚无任何具有相同 <key> 的附注行时,可以选择要执行的操作。
此选项的有效值包括:
add
(这是默认值)和doNothing
。使用
add
,将添加一个新的附注行。使用
doNothing
,将不执行任何操作。 - trailer.<keyAlias>.key
-
为 <key> 定义一个 <keyAlias>。<keyAlias> 必须是 <key> 的前缀(不区分大小写)。例如,在
git
config
trailer.ack.key
"Acked-by"
中,“Acked-by”是 <key>,“ack”是 <keyAlias>。此配置允许在命令行上使用“ack”<keyAlias> 调用更短的--trailer
"ack:..."
,而不是更长的--trailer
"Acked-by:..."
。在 <key> 的末尾,可以出现一个分隔符,然后是一些空格字符。默认情况下,唯一有效的分隔符是 :,但这可以使用
trailer.separators
配置变量进行更改。如果键中存在分隔符,则在添加附注行时,它会覆盖默认分隔符。
- trailer.<keyAlias>.where
-
此选项采用与 trailer.where 配置变量相同的值,它会覆盖该选项为具有指定 <keyAlias> 的附注行所指定的内容。
- trailer.<keyAlias>.ifexists
-
此选项采用与 trailer.ifexists 配置变量相同的值,它会覆盖该选项为具有指定 <keyAlias> 的附注行所指定的内容。
- trailer.<keyAlias>.ifmissing
-
此选项采用与 trailer.ifmissing 配置变量相同的值,它会覆盖该选项为具有指定 <keyAlias> 的附注行所指定的内容。
- trailer.<keyAlias>.command
-
已弃用,建议使用 trailer.<keyAlias>.cmd。此选项的行为方式与 trailer.<keyAlias>.cmd 相同,不同之处在于它不会向指定命令传递任何参数。相反,子字符串 $ARG 的第一个出现将被替换为将作为参数传递的 <value>。
请注意,用户命令中的 $ARG 只会被替换一次,并且替换 $ARG 的原始方式不安全。
当为相同的 <keyAlias> 同时提供了 trailer.<keyAlias>.cmd 和 trailer.<keyAlias>.command 时,将使用 trailer.<keyAlias>.cmd,并忽略 trailer.<keyAlias>.command。
- trailer.<keyAlias>.cmd
-
此选项可用于指定一个 shell 命令,该命令将被调用一次以自动添加具有指定 <keyAlias> 的附注行,然后每当指定 --trailer <keyAlias>=<value> 参数时再次调用,以修改此选项将生成的附注行的 <value>。
当首次调用指定命令以添加具有指定 <keyAlias> 的附注行时,其行为等同于在“git interpret-trailers”命令开头添加了一个特殊的 --trailer <keyAlias>=<value> 参数,其中 <value> 被认为是命令的标准输出,并去除了任何前导和尾随空白字符。
如果在命令行上也传递了某些 --trailer <keyAlias>=<value> 参数,则该命令将针对每个具有相同 <keyAlias> 的此类参数再次调用一次。并且这些参数的 <value> 部分(如果有)将作为其第一个参数传递给该命令。通过这种方式,命令可以从 --trailer <keyAlias>=<value> 参数中传递的 <value> 计算出 <value>。
示例
-
配置一个带有 Signed-off-by 键的 sign 附注行,然后将其中两个附注行添加到提交消息文件中
$ 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>
-
使用
--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>
-
将最后一次提交提取为补丁,并向其添加一个 Cc 和一个 Reviewed-by 附注行
$ 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
-
配置一个带有命令的 sign 附注行,该命令仅在尚无“Signed-off-by:”的情况下自动添加带有作者信息的“Signed-off-by:”,并演示其工作原理
$ 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>
-
配置一个带有键的 fix 附注行,该键包含 # 且此字符后无空格,并演示其工作原理
$ git config trailer.separators ":#" $ git config trailer.fix.key "Fix #" $ echo "subject" | git interpret-trailers --trailer fix=42 subject Fix #42
-
配置一个带有命令的 help 附注行,该命令使用脚本
glog-find-author
从 Git 仓库中的 Git 日志中搜索指定的作者身份,并演示其工作原理$ 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>
-
配置一个带有命令的 ref 附注行,该命令使用脚本
glog-grep
从 Git 仓库中的 Git 日志中查找(grep)最后一次相关的提交,并演示其工作原理$ 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)
-
配置一个带有命令的 see 附注行,该命令显示相关提交的主题,并演示其工作原理
$ 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)
-
配置一个提交模板,其中包含一些值为空的附注行(使用 sed 显示并保留附注行末尾的尾随空格),然后配置一个 commit-msg 钩子,使用 git interpret-trailers 删除值为空的附注行并添加一个 git-version 附注行
$ 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