Git log grep:如何匹配提交消息子字符串而不考虑词序?

Git log grep: How to match commit-message substrings regardless of word-order?

我试过了

git log -i --all --grep='/(?=.*fix)(?=.*a)(?=.*bug)/'

但是没用。

有几个问题:

  • 使用 grep 时,正则表达式模式不会在正则表达式定界符内传递,而是作为常规字符串传递
  • 您使用的 PCRE-compliant 模式可能无法正常工作,因为默认 git grep 正则表达式引擎是 POSIX BRE flavor
  • 您使用的模式在同一行上以任意顺序匹配 fixabug 但是 要求它们全部是当前的。要以任何顺序匹配指定的字符串,您需要交替模式,例如a|b|c。但是,在 POSIX BRE 中,不支持交替运算符,尽管 GNU 工具中可用的 POSIX 扩展允许使用 \| 交替运算符版本。

因此,如果您打算以任意顺序匹配这 3 个词的条目,则需要删除正则表达式分隔符并启用 PCRE 正则表达式引擎:

git log -i -P --all --grep='^(?=.*fix)(?=.*a)(?=.*bug)'

请注意启用 PCRE 正则表达式引擎的 -P 选项。另外,请注意文档中的内容:

-P
--perl-regexp
Consider the limiting patterns to be Perl-compatible regular expressions.

Support for these types of regular expressions is an optional compile-time dependency. If Git wasn’t compiled with support for them providing this option will cause it to die.

如果要将条目与任何单词匹配,可以使用

git log -i -E --all --grep='fix|a|bug'

使用 -E 选项,POSIX ERE 语法被强制执行,并且 | 是这种正则表达式风格中的交替模式。

要将它们作为整个单词进行匹配,请使用 \b\</\> 单词边界:

git log -i -E --all --grep='\<(fix|a|bug)\>'
git log -i -E --all --grep='\b(fix|a|bug)\b'

Windows 用户注意:

在Windows Git CMD或Windows控制台中,'必须替换为":

git log -i -P --all --grep="^(?=.*fix)(?=.*a)(?=.*bug)"
git log -i -E --all --grep="\b(fix|a|bug)\b"