使用perl正则表达式的git log

时间:2014-12-11 21:52:36

标签: regex git perl

我正在尝试使用git log -G进行搜索,其中正则表达式包含负面的lookbehind。例如:

git log -G "(?<!sup)port" --all

这不起作用,根据我的搜索,我认为是因为-G使用不支持负面外观的POSIX正则表达式。

我认为这需要Perl兼容的正则表达式支持。 git log有一个--perl-regexp标志,但是从文档和示例中我只看到如何使用它来搜索提交消息中的字段,而不是代码。

如何使用Perl正则表达式搜索git log的代码?

1 个答案:

答案 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;