我正在尝试使用 git log -G
和包含负后视的正则表达式进行搜索。例如:
git log -G "(?<!sup)port" --all
这不起作用,根据我的搜索,我认为这是因为 -G
使用不支持否定环视的 POSIX 正则表达式。
我认为这需要 Perl 兼容的正则表达式支持。 git log
有一个 --perl-regexp
标志,但从文档和示例中我只看到如何使用它来搜索提交消息中的作者等字段,而不是代码。
如何使用 Perl 正则表达式通过 git log
搜索代码?
最佳答案
您可以使用以下程序模拟该功能。它有两个参数:一个可能会返回比您想要的更多结果的粗过滤器,然后是一个完整的 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;
关于regex - 带有 perl 正则表达式的 git 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433085/