Git - 检测提交是否已注销

jsh*_*ton 7 git

是否有任何 git 命令或更简单的格式来确定提交是否已注销?

Von*_*onC 15

随着Git的1.7.9,2011十月,你如何git log --show-signature(中提到克里斯的答案),但与2.10(Q3 2016) ,你可以简单的设置git config log.showSignature true,将与工作git-loggit-showgit-whatchangedgit-reflog


为了方便搜索“ Signed-off-By”,您现在(Git 2.12,2017 年第一季度)可以仅使用提交消息的“拖车”部分进行登录。(预告片包括“ Signed-off-By”和其他“ Acknowledged By”消息)

请参阅Jacob Keller ( )提交的 b1d31c8d9f31fb(2016 年 11 月 19 日(由Junio C Hamano合并-- --提交 f008159 中,2016 年 12 月 19 日,Git 2.12.0-rc0)jacob-kellergitster

pretty: 添加%(trailers)用于显示提交消息尾部的格式

此外%(subject)%(body)git log --pretty=format:...”学了新的占位符%(trailers)%(contents:trailers)


您还有git interpret-trailers,它刚刚在 Git 2.14.x/2.15(2017 年第三季度)中发展

请参阅Martin Ågren (``) 的提交 5a0d0c0(2017 年 8 月 20 日
提交58311c6提交cc1735c提交a388b10提交99e09da提交0000239提交fdbdb64提交56c493e(2017年8月15日),并提交8abc898(2017年8月10日),由杰夫·王(peff
(由Junio C gitsterHamano合并-- --commit 06cf4f2,2017 年 8 月 27 日)

git interpret-trailers”已经学会了--parse”和其他一些选项,使脚本更容易从提交日志消息中获取现有的预告片行。

git log --pretty=format:%(trailers:only:unfold)
Run Code Online (Sandbox Code Playgroud)

实际上:

git log --pretty=format:%(trailers:only,unfold)
                                     ^^^^^
Run Code Online (Sandbox Code Playgroud)

请参阅Taylor Blau ( )提交的 84ff053 (2017 年 10 月 1 日)(由Junio C Hamano合并-- --提交 436b359 中,2017 年 10 月 7 日)ttaylorr
gitster

pretty.c:%(trailers)用“ ,”分隔“ ”参数

在准备向的 " " 参数添加一致的 " %(trailers)" 原子选项时 ,将 " " in更改为使用 " " 而不是" " 来分隔子参数。git-for-each-ref(1)--format%(trailers)pretty.c,:

多个子参数以“ %(trailers:unfold,only)”或“ %(trailers:only,unfold)”的形式给出。

此更改消除了“顶级”参数和提供给拖车原子本身的参数之间的歧义。它与“ %(upstream)”和“ %(push)”原子的行为一致。


注意:这在 Git 2.20(2018 年第 4 季度)中更加健壮,因为“ git interpret-trailers”及其底层机制有一个错误的代码,它试图在提交日志消息后忽略补丁文本,这在各种代码路径中触发,这些代码路径总是单独获取日志消息和永远不会得到这样的输入。

请参阅Jeff King ( ) 的commit 66e83d9commit ffce7f5commit e5fba5dcommit 1688c9acommit c188668commit 00a21f5commit a3b636ecommit 0d2db00(2018 年 8 月 23 日(由Junio C Hamano合并-- --提交 fba9654 中,2018 年 9 月 17 日)peff
gitster

sequencer:---解析预告片时忽略“ ”分隔符

当定序器代码附加签收或挑选来源时,它使用默认的拖车解析选项,将“ ---”视为提交消息的结尾。
因此,它可能会被包含该字符串的提交消息所迷惑,并且无法找到现有的尾部块。更令人困惑的是,实际的追加代码并不知道“ ---”,并且总是追加到字符串的末尾。
这可能会导致奇怪的结果。

例如,在提交消息中附加一个签名,如下所示:

 subject

 body
 ---
 these dashes confuse the parser!

 Signed-off-by: A
Run Code Online (Sandbox Code Playgroud)

导致输出具有最终块,如:

 Signed-off-by: A

 Signed-off-by: A
Run Code Online (Sandbox Code Playgroud)

解析器认为消息的最后一行是“正文”,并忽略其他所有内容,声称没有预告片。
所以我们输出一个额外的换行符(错误)并添加一个重复的签名(也是错误的)。

因为我们知道我们正在提供一个纯粹的提交消息,我们可以简单地告诉解析器忽略 " ---" 分隔符。


Git 2.22(2019 年第二季度)增加了几个选项:

提交0b691d8提交fd2015b提交d9b936d提交250bea0提交3e3f347(2019年1月28日),提交4f732e0(2019年1月29日),以及提交4261775(2018年12月8日)由安德斯Waldenborg( )wanders
(由Junio C gitsterHamano合并-- --在2019 年 3 月 7 日提交 42977bf 中

pretty: 添加对separator选项的支持%(trailers)

默认情况下,拖车线以换行符 (' \n')终止。
通过指定新的 ' separator' 选项,它们将改为由用户提供的字符串分隔,并具有分隔符语义而不是终止符语义。
分隔符字符串可以包含文字格式代码,%n%xNN允许它是难以键入的内容,例如%x00, 或逗号和结束括号,这会破坏解析。

例如:

$ git log --pretty='%(trailers:key=Reviewed-by,valueonly,separator=%x00)'
Run Code Online (Sandbox Code Playgroud)

和:

pretty: 添加对 " valueonly" 选项的支持%(trailers)

使用新的 " key=" 选项%(trailers)通常无法显示密钥,因为根据定义,它已经知道在那里打印哪个预告片。
这个新的 " valueonly" 选项使它在打印预告片时省略了键。

例如:

$ git show -s --pretty='%s%n%(trailers:key=Signed-off-by,valueonly)' aaaa881
Run Code Online (Sandbox Code Playgroud)

将会呈现:

upload-pack: fix broken if/else chain in config callback
Jeff King <peff@peff.net>
Junio C Hamano <gitster@pobox.com>
Run Code Online (Sandbox Code Playgroud)

( man ) ”的解析器在解析“ ”原子时过于松散,忘记了“ ”和“ ”是唯一允许的两种形式,这已在 Git 2.29(2020 年第 4 季度)中得到纠正。git for-each-ref --format=...%(trailers...)trailerstrailers:<modifiers>

请参阅Hariom Verma ( )提交的 2c22e10提交 a8e0f50(2020 年 8 月 21 日(由Junio C Hamano合并-- --提交 e177238 中,2020 年 8 月 31 日)harry-hov
gitster

ref-filter: ' contents:trailers' 如果:缺少则显示错误

导师:Christian Couder
导师:Heba Waly
帮助:Eric Sunshine
签约:Hariom Verma

如果与“ trailers”原子一起使用并且在拖车参数之前缺少冒号,则“内容”原子不会显示任何错误。

例如%(contents:trailersonly)工作,而它不应该。

这绝对不是预期的行为。

让我们修复这个错误。


在 Git 2.31(2021 年第一季度)中,“ --format=%(trailers)”机制得到增强,可以更轻松地设计用于机器消费的输出。

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 058761f提交 9d87d5a提交 8b966a0提交 2762e17(2020 年 12 月 9 日)和提交 7c1f79f(2020 年 12 月 6 日(由Junio C Hamano合并-- --提交 b62bbd3 中,2021 年 1 月 6 日)avar
gitster

pretty format %(trailers): 添加一个“keyonly”

签字人:Ævar Arnfjörð Bjarmason

添加对“keyonly”的支持。这允许更容易地解析出键和值。在此之前,如果您不想对密钥的格式进行假设。您需要将其解析为例如:

--pretty=format:'%H%x00%(trailers:separator=%x00%x00)' \
                   '%x00%(trailers:separator=%x00%x00,valueonly)'
Run Code Online (Sandbox Code Playgroud)

然后通过查看这两个并从非 valueonly %(trailers) 行中减去值加上硬编码的“:”分隔符来继续推导键。现在可以简单地做:

--pretty=format:'%H%x00%(trailers:separator=%x00%x00,keyonly)' \
                '%x00%(trailers:separator=%x00%x00,valueonly)'
Run Code Online (Sandbox Code Playgroud)

这至少将其简化为一个状态机,您可以在其中获得 N 个密钥并将它们与 N 个值相关联。更好的是有办法将“:”分隔符更改为易于机器读取的内容(键也可能包含“:”)。后续更改将增加对此的支持。

我真的没有一个仅用于“keyonly”的用例。我想在某些情况下它会很有用,因为“key=*”匹配不区分大小写,所以一个普通的“keyonly”会给你匹配的键的变体。我主要是添加它来解决与“valueonly”的不一致。

pretty-formats现在包括在其手册页中

  • ' keyonly[=<BOOL>]':只显示预告片的关键部分。
  • ' valueonly[=<BOOL>]':只显示预告片的价值部分。

和:

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 058761f提交 9d87d5a提交 8b966a0提交 2762e17(2020 年 12 月 9 日)和提交 7c1f79f(2020 年 12 月 6 日(由Junio C Hamano合并-- --提交 b62bbd3 中,2021 年 1 月 6 日)avar
gitster

pretty format %(trailers): 添加一个 "key_value_separator"

签字人:Ævar Arnfjörð Bjarmason

"key_value_separator""%(trailers)"漂亮格式添加一个选项,以配合现有的“分隔符”参数。
结合这两个选项,可以轻松生成机器可读(例如\0\0\0分隔符)格式的输出。

正如之前添加“ keyonly”的提交中所阐述的那样,在添加%(trailers)"key_value_separator"选项之前从“ ”中提取结构化数据是不必要的乏味。
正如此处添加的测试所见,提取此数据现在变得微不足道。

pretty-formats现在包括在其手册页中

  • 'key_value_separator=<SEP> ':指定在尾行之间插入的分隔符。如果没有给出这个选项,每个预告片键值对都用“:”分隔。

AlB*_*lue 3

您可以git log --invert-grep --grep="Signed-off-By"在Git 2.4及以上版本中使用。(该--invert-grep选项是在 2.4 中添加的。)