我应该如何只显示声明特定页脚的提交?

问题描述 投票:0回答:1

阅读关于从提交中提取页脚的这个问题,答案对于我的特定用例来说还有一些不足之处。使用建议的命令(

git log --format="%h %s %(trailers:key=Issue,valueonly)"
),会显示所有提交,甚至那些没有“问题”页脚的提交。

继续示例页脚“Issue”:假设我的存储库包含一些声明问题的提交,以及一些没有声明问题的提交,并且我只查找具有相关页脚的提交 - 最好的方法是什么只显示声明特定页脚的提交?

当然,一种选择是删除

,valueonly
,然后 grep for "Issue:":
git log --format="%h %s %(trailers:key=Issue)" | grep Issue:
,但这需要显示密钥。显然,在某些情况下,这可以解决 - 例如,按照上述问题,我们可以使用 sed 删除“Issue:”,但这会带来以下挑战:

  • 每行可能多次出现字符串“Issue:”,导致输出错误;
  • 格式可能跨越多行,使得这种方法不合适;
  • 一些非页脚内容可能包含字符串“Issue:”,导致误报。

我考虑过的另一个可能相当复杂的解决方案是仅显示

%h %(trailers:key=Issue)
,同时使用 --grep 表示
Issue:
[1],提取
%h
git show
每个提交都具有所需的内容格式。这种方法给我留下了命令:
git log --format="%h %(trailers:key=Issue)" --grep Issue: | awk '{print $1}' | xargs git --no-pager show
,这似乎不必要地复杂且低效(因为它运行
git-log
两次)。

是否有更好的(语法上更清晰和/或更高效的编程方式)方法来仅显示声明特定页脚的提交?

[1] 感谢 Guildenstern 在评论中提醒我

git-log --grep
存在,而我不必
git log | grep

git git-log git-show
1个回答
0
投票

不幸的是似乎没有办法专门搜索 直接拖车/页脚。 正如您刚才正确指出的那样 搜索字符串并不可靠,因为拖车键可以 发生在预告片部分之前。

但我们不需要做太多:

git log --format="%H %(trailers:key=Issue)%-C()" \
    | sed -e '/^I/Id' \
    | sed -e '/I/!d' \
    | cut -d' ' -f1 \
    | git log --no-walk --stdin

正如你所描绘的,我们应该从

--format

git log --format="%H %(trailers:key=Issue)"

接下来我们需要过滤掉一些不必要的输出,因为预告片键可以 在同一条提交消息中多次出现:

fedc612314acfebf506e071bf3a941076aa56d10 Issue: 987
Issue: 465

这意味着我们需要:

sed -e '/^I/Id'

我们需要

I
(不区分大小写的匹配),因为显然预告片 密钥匹配不区分大小写。 [1]

下一个 sed(1) 表达式会过滤掉没有此预告片的提交。

sed -e '/I/!d'

虽然我无法让

I
开关工作。我无法得到
[Ii]
也可以工作。

最后一行获取所有输入(所有哈希值)并显示它们。

--no-walk
确保祖先不会被找到,因为他们是 与您的搜索无关。

git log --no-walk --stdin

(git-show(1)也可以用来代替git-log(1))

注释

  1. 这个开关似乎并不是在所有 sed(1) 中都可用 实施
© www.soinside.com 2019 - 2024. All rights reserved.