【发布时间】:2015-06-12 10:00:36
【问题描述】:
我正在尝试使用不以[core] 开头的消息来识别所有提交。这些是我失败的尝试:
-
简单的方法
git rev-list --grep '^(?!(\[core\]).).+' "branch1...branch2"- 空结果
-
启用扩展标志
git rev-list -E --grep '^(?!(\[core\]).).+' "branch1...branch2"错误消息
fatal: command line, '^(?!(\[core\]).).+': Invalid preceding regular expression。git grep 似乎不支持负前瞻。
-
将所有提交的列表与带有标签 (cf. this answer) 的提交列表进行比较:
git rev-list "branch1...branch2" | grep -Fxv <(git rev-list -E --grep '^\[core\].+' "branch1...branch2")-
sh: syntax error near unexpected token `('中的结果
-
PS:我无法升级到 Git 2.x,所以--invert-grep 不是一个选项
【问题讨论】:
-
三个中的失败是你在
<和(之间添加的空格。删除它。但是,如果该正则表达式在前两次尝试中无法与rev-list一起使用,为什么您认为它会在第三次尝试中使用? -
哦,我实际上在第三次尝试中使用了负等效项。当您尝试为您的问题而不是您的原始问题提供一个最小示例时,这就是问题所在:-)。删除空间并没有改变任何东西
-
你用的是什么外壳?
<(...)是进程替换,在 bash 中应该可以正常工作,但在 ash/dash/csh/etc 中不行。 -
好吧,看来进程替换确实是问题所在。我在 Windows 下使用 git bash。当我在 git hook 中执行命令时,错误是
cannot make pipe for process substitution: Function not implemented -
是的,似乎 git-bash 中的 bash 不支持进程替换。命令替换虽然有效。试试我的答案中的 sn-p 吗?
标签: git grep git-rev-list