我正在尝试使用git log -G
进行搜索,其中正则表达式包含负面的lookbehind。例如:
git log -G "(?<!sup)port" --all
这不起作用,根据我的搜索,我认为是因为-G
使用不支持负面外观的POSIX正则表达式。
我认为这需要Perl兼容的正则表达式支持。 git log
有一个--perl-regexp
标志,但是从文档和示例中我只看到如何使用它来搜索提交消息中的字段,而不是代码。
如何使用Perl正则表达式搜索git log
的代码?
答案 0 :(得分:0)
您可以使用以下程序模拟该功能。它需要两个参数:一个粗略的过滤器,可能会返回比你想要的更多的结果,然后是一个完整的Perl模式,将结果缩小到你想要的结果。
对于您问题中的示例,您可以按
中的方式运行它logrx port '(?<!sup)port'
假设该程序位于logrx
中,可执行,位于PATH
,依此类推。
#! /usr/bin/env perl
use strict;
use warnings;
no warnings 'exec';
die "Usage: $0 pickaxe-string perl-pattern\n"
unless @ARGV == 2;
my($_S,$_G) = @ARGV;
my $filter = eval 'qr/^[-+]' . $_G . "/m"
or die "$0: invalid perl pattern: $@";
sub filter { local($_) = @_; print if /$filter/ }
open my $log, "-|", "git", "log", "-p", "-S" . $_S, "--all"
or die "$0: failed to start git log: $!";
my $commit;
while (<$log>) {
if (/^commit [0-9a-f]{40}$/) {
filter $commit if defined $commit;
$commit = $_;
}
else {
$commit .= $_;
}
}
filter $commit if defined $commit;