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
- 您使用的模式在同一行上以任意顺序匹配
fix
、a
或 bug
但是 要求它们全部是当前的。要以任何顺序匹配指定的字符串,您需要交替模式,例如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"
我试过了
git log -i --all --grep='/(?=.*fix)(?=.*a)(?=.*bug)/'
但是没用。
有几个问题:
- 使用
grep
时,正则表达式模式不会在正则表达式定界符内传递,而是作为常规字符串传递 - 您使用的 PCRE-compliant 模式可能无法正常工作,因为默认
git grep
正则表达式引擎是 POSIX BRE flavor - 您使用的模式在同一行上以任意顺序匹配
fix
、a
或bug
但是 要求它们全部是当前的。要以任何顺序匹配指定的字符串,您需要交替模式,例如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"