regex - 带有 perl 正则表达式的 git 日志

标签 regex git perl

我正在尝试使用 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/

相关文章:

python - 如何使用 "contains"进行过滤?

Git 忘记了我正在 merge 的事实

从指定的提交到今天,Git 将文件导出为 zip/tar

perl - 由内而外的 Perl 类的深度克隆 - 如何使用复制对象的方法?

Perl 发布请求以 base64 格式发送 zip 文件?

c# - 如果给定模式,是否有可以生成随机正则表达式字符串的类?

c# - 使用 Lookahead 使用正则表达式匹配字符串

git - git 1.8 客户端和旧版 git 服务器之间的兼容性问题

python - 如何使用 TCL/Perl 规范化 IPv6 ip?

python - 查找字符串中下一次出现的位置