阅读关于从提交中提取页脚的这个问题,答案对于我的特定用例来说还有一些不足之处。使用建议的命令(
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:”,但这会带来以下挑战:
我考虑过的另一个可能相当复杂的解决方案是仅显示
%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 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))