Git
English ▾ 主题 ▾ 最新版本 ▾ git-interpret-trailers 最后更新于 2.45.0

名称

git-interpret-trailers - 在提交消息中添加或解析结构化信息

概要

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 <[email protected]>
Signed-off-by: Bob <[email protected]>

最后两行以“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的任何效果,以便不再覆盖相关的配置变量。可能的放置位置为afterbeforeendstart

--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的任何效果,以便不再覆盖相关的配置变量。可能的动作是addIfDifferentaddIfDifferentNeighboraddreplacedoNothing

--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的任何效果,以便不再覆盖相关的配置变量。可能的动作是doNothingadd

--only-trailers

仅输出预告信息,不输出输入中的任何其他部分。

--only-input

仅输出输入中存在的预告信息;不要从命令行添加任何预告信息,也不要应用trailer.*配置变量。

--unfold

如果预告信息的value跨越多行(也称为“折叠”),则将其重新格式化为单行。

--parse

--only-trailers --only-input --unfold 的便捷别名。这使得更容易仅查看来自输入的预告信息,而不会受任何命令行选项或配置变量的影响,同时还使用 --unfold 使输出对机器友好。

--no-divider

不要将---视为提交消息的结尾。当您知道您的输入仅包含提交消息本身(而不是电子邮件或git format-patch的输出)时使用此选项。

配置变量

trailer.separators

此选项指定哪些字符被识别为预告信息分隔符。默认情况下,只有:被识别为预告信息分隔符,但=在命令行上始终被接受,以兼容其他git命令。

此选项给出的第一个字符将是当为此预告信息在配置中未指定其他分隔符时使用的默认字符。

例如,如果此选项的值为"%=$",则只有使用格式<key><sep><value>的行(其中<sep>包含%=$,然后是空格)才会被视为预告信息。并且%将是使用的默认分隔符,因此默认情况下预告信息将显示为:<key>% <value>(键和值之间将出现一个百分号和一个空格)。

trailer.where

此选项指定将在哪里添加新的预告信息。

可以是end(默认值)、startafterbefore

如果为end,则每个新的预告信息都将出现在现有预告信息的末尾。

如果为start,则每个新的预告信息都将出现在现有预告信息的开头,而不是结尾。

如果为after,则每个新的预告信息都将出现在具有相同<key>的最后一个预告信息之后。

如果为before,则每个新的预告信息都将出现在具有相同<key>的第一个预告信息之前。

trailer.ifexists

此选项使得当输入中已经存在至少一个具有相同<key>的预告信息时,可以选择执行的操作。

此选项的有效值为:addIfDifferentNeighbor(默认值)、addIfDifferentaddreplacedoNothing

使用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>。此配置允许在命令行上使用较短的--trailer "ack:..."调用,使用“ack”<keyAlias>而不是较长的--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>.cmdtrailer.<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 <[email protected]>' --trailer 'sign: Bob <[email protected]>' <msg.txt
    subject
    
    body text
    
    Signed-off-by: Alice <[email protected]>
    Signed-off-by: Bob <[email protected]>
  • 使用--in-place选项就地编辑提交消息文件

    $ cat msg.txt
    subject
    
    body text
    
    Signed-off-by: Bob <[email protected]>
    $ git interpret-trailers --trailer 'Acked-by: Alice <[email protected]>' --in-place msg.txt
    $ cat msg.txt
    subject
    
    body text
    
    Signed-off-by: Bob <[email protected]>
    Acked-by: Alice <[email protected]>
  • 将最后一个提交提取为补丁,并向其中添加CcReviewed-by预告信息

    $ git format-patch -1
    0001-foo.patch
    $ git interpret-trailers --trailer 'Cc: Alice <[email protected]>' --trailer 'Reviewed-by: Bob <[email protected]>' 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 <[email protected]>
    $ cat msg2.txt
    subject
    
    body text
    
    Signed-off-by: Alice <[email protected]>
    $ git interpret-trailers --trailer sign <msg2.txt
    subject
    
    body text
    
    Signed-off-by: Alice <[email protected]>
  • 配置一个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 <[email protected]>
    Helped-by: Christian Couder <[email protected]>
  • 配置一个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来显示并保留预告信息末尾的尾随空格),然后配置一个提交消息钩子,该钩子使用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

GIT

git[1]套件的一部分

scroll-to-top