提交消息中的 Git 魔术关键字(签名人、合着者、修复等)

use*_*610 4 git commit-message github gitlab

Git 命令本身支持Signed-off-by: Person's name <persons@email>行。

GitHub添加了 Co-authored-by:一行,然后在 UI 中将提交者和引用的人都显示为提交作者。

此外,GitHubGitLab各自识别一组关键字来在合并提交时关闭问题。

上面的 Git 魔术关键字列表是否完整?添加这些行和关键字是否有标准化过程?这些是否定义为不区分大小写?

Von*_*onC 15

来自OP:

git命令本身支持该Signed-off-by: Person's name <persons@email>行。

从 Git 2.32(2021 年第 2 季度)开始,git命令本身支持......您想要的任何预告片!

git commit男人学到的--trailer <key>[=<value>]选项;与解释拖车命令一起使用,这将使支持自定义拖车变得更容易。

请参阅由ZheNing Hu ( )提交的 2daae3d(2021 年 3 月 23 日)。(由Junio C Hamano 合并 -- --提交 68e15e0,2021 年 4 月 7 日)adlternative
gitster

commit: 添加 --trailer 选项

签字人:胡哲宁

从历史上看,Git在命令行中Signed-off-by使用“ ”--signoff和“ ”选项支持“ ”提交预告片。 但用户可能需要从命令行提供其他预告片信息,例如“ ”、“ ”、“ ”、-s
Helped-byReported-byMentored-by

现在实现一个新--trailer <token>[(=|:)<value>]选项来传递其他预告片interpret-trailers并将它们插入到提交消息中。

git commit现在包含在其手册页中:

--trailer <token>[(=|:)<value>]

指定应用作预告片的( <token>, ) 对。<value>

例如:

git commit --trailer "Signed-off-by:C O Mitter <committer@example.com>" \
           --trailer "Helped-by:C O Mitter <committer@example.com>"
Run Code Online (Sandbox Code Playgroud)

这会将“ Signed-off-by”预告片Helped-by”预告片添加到提交消息中。

配置trailer.*变量 ( git interpret-trailers) 可用于定义是否省略重复的预告片、在预告片运行中每个预告片将出现的位置以及其他详细信息。


关于该trailer.xxx配置,请考虑您想要使用附加预告片修改的初始提交:

Signed-off-by: C O Mitter <committer@example.com>
Signed-off-by: C1 E1
Reported-by: C3 E3
Mentored-by: C4 E4
Helped-by: C3 E3
Run Code Online (Sandbox Code Playgroud)

trailer.ifexists="replace"如果您通过添加相同的Reported-by 来修改配置,则配置将保持消息不变:

git -c trailer.ifexists="replace" \
    commit   --trailer "Mentored-by: C4 E4" \
             --trailer "Helped-by: C3 E3" \
             --amend
Run Code Online (Sandbox Code Playgroud)

但如果你修改相同的提交,trailer.ifexists="add"则意味着:

Signed-off-by: C O Mitter <committer@example.com>
Signed-off-by: C1 E1
Helped-by: C2 E2
Reported-by: C3 E3
Mentored-by: C4 E4
Reported-by: C3 E3  <<<< added twice
Mentored-by: C4 E4  <<<< added twice
Run Code Online (Sandbox Code Playgroud)

并使用trailer.ifexists="addIfDifferent"

Signed-off-by: C O Mitter <committer@example.com>
Signed-off-by: C1 E1
Reported-by: C3 E3
Mentored-by: C4 E4
Helped-by: C3 E3
Run Code Online (Sandbox Code Playgroud)

你得到:

Signed-off-by: C O Mitter <committer@example.com>
Signed-off-by: C1 E1
Helped-by: C2 E2
Reported-by: C3 E3
Mentored-by: C4 E4
Mentored-by: C5 E5  <<<< Only C5 E5 is added
Run Code Online (Sandbox Code Playgroud)

而且,在 Git 2.32(2021 年第 2 季度)中,trailer.<token>.command配置变量指定的命令行接收最终用户提供的值的方式既容易出错又具有误导性。
添加了一种以更安全、更直观的方式实现相同目标的替代方案(作为trailer.<token>.cmd配置变量)来取代它。

请参阅由ZheNing Hu ( )提交的 c364b7e57dcb65 提交(2021 年 5 月 3 日)。(由Junio C Hamano 合并 -- --提交 2cd6ce2中,2021 年 5 月 11 日)adlternative
gitster

trailer:添加新的.cmd配置选项

帮助者: Junio C Hamano
帮助者: Christian Couder
签字人: 胡哲宁

配置trailer.<token>.command变量指定一个命令(通过 shell 运行,因此它不必是该命令的单个名称或路径,但可以是一个 shell 脚本),并且第一次出现的子字符串$ARG将替换为给定的值interpret-trailer' ' 参数中令牌的命令--trailer <token>=<value>

这有三个缺点:

  • 该机制中的使用$ARG会误导用户,该值是在 shell 变量中传递的,并诱使他们$ARG多次使用,但这是行不通的,因为第二个和后续的值$ARG不会被替换。
  • 因为$ARG在不考虑 shell 语言语法的情况下进行文本替换,即使$ARG用户希望保持完整的 ' ' (在单引号对内)也会被替换,更糟糕的是,如果该值具有不匹配的单引号(想象一下像“O'Connor”这样的名字,替换成NAME='$ARG'NAME='O'Connor'),它会导致语法不正确(或更糟)的损坏命令。
  • 当第一次调用命令$ARG以添加具有指定的预告片时,命令中第一次出现的子字符串将被替换为空字符串<token>
    这是一个糟糕的设计,自动执行的本质导致它添加了我们不期望的预告片。

引入一个新trailer.<token>.cmd配置,该配置具有更高的优先级来弃用并最终删除trailer.<token>.command,它将值作为参数传递给命令。用户可以在脚本中将该值称为位置参数 $1,
而不是“ ”。 同时,为了让( man )更好地模拟git命令的行为,' '不会自动执行。$ARG
git interpret-trailers-strailer.<token>.cmd

git interpret-trailers现在包含在其手册页中:

此选项的行为方式与“ ”相同trailer.<token>.cmd,只是它不将任何内容作为参数传递给指定的命令。相反,第一次出现的子字符串$ARG将被作为参数传递的值替换。

' trailer.<token>.command' 选项已被弃用,取而代之的是 ' trailer.<token>.cmd',因为$ARG在用户命令中仅替换一次,并且原始替换方式$ARG不安全。

当 ' trailer.<token>.cmd' 和 ' trailer.<token>.command' 都给出相同的值时<token>trailer.<token>.cmd使用 ' ' 并trailer.<token>.command忽略 ' '。

trailer.<token>.cmd

git interpret-trailers现在包含在其手册页中:

这些参数中的一个(如果有)将作为其第一个参数传递给命令。
这样,该命令可以根据<value>传入的“ --trailer <token>=<value>”参数生成计算结果。

git interpret-trailers现在包含在其手册页中:

  • 使用 cmd 配置“帮助”预告片,使用一个脚本glog-find-author ,该脚本从 git 存储库中的 git log 搜索指定的作者身份并显示其工作原理:
git -c trailer.ifexists="replace" \
    commit   --trailer "Mentored-by: C4 E4" \
             --trailer "Helped-by: C3 E3" \
             --amend
Run Code Online (Sandbox Code Playgroud)
  • 使用 cmd 配置“ref”预告片,使用脚本glog-grep 从 git 存储库中的 git 日志中 grep 最后相关提交,并显示其工作原理:
Signed-off-by: C O Mitter <committer@example.com>
Signed-off-by: C1 E1
Helped-by: C2 E2
Reported-by: C3 E3
Mentored-by: C4 E4
Reported-by: C3 E3  <<<< added twice
Mentored-by: C4 E4  <<<< added twice
Run Code Online (Sandbox Code Playgroud)

  • 嗯,“查理·奥斯卡·米特”?“夏洛特-奥利维亚·米特”?我必须知道。 (3认同)

Chr*_*ann 5

这些被称为预告片,几乎可以是任何键值对。没有标准化流程,拖车线的解释依赖于平台(例如 GitHub、GitLab)。另请参阅git-interpret-trailers文档

编辑:这里是有关不同工具使用的一些附加预告片的一些信息。

编辑 (2):Git 本身对“Signed-off-by:”预告线以及“(cherry pick from commit”预告线)有一些内置支持。请参阅拖车.c中的 git_generated_prefixes以及常量在 sequencer.c 中