git grep - 但仅限于索引中的新文件或修改过的文件

时间:2012-12-19 15:15:15

标签: git grep

是否可以让git grep仅搜索索引/缓存中的新文件或已修改文件?

(用例是在预提交钩子中使用,在预期提交中查找console.log等“调试”代码。但我不会被console.log打扰在“现有”代码中。最好这也不能匹配删除console.log实例,但我可以使用匹配的代码!)

5 个答案:

答案 0 :(得分:15)

事实证明,这样做的方法不是通过git grep,而是通过完全不同的命令,也恰好能够搜索:git diff-index。 (简单和正交的另一个胜利......)

我想通过以下方式实现:

$ git diff-index -U --cached -G <regexp> HEAD

答案 1 :(得分:8)

我通常只做以下事情:

git diff | grep TODO

如果您有足够的更改行以使其变得烦人,那么我会添加| grep '^+',或者开始使用-[ABC]选项。

答案 2 :(得分:1)

您可以在.git / hooks目录中创建一个git预提交挂钩(它只是一个shell脚本,标记为可执行文件),它会扫描您的提交差异以查找任何新添加的行(+的行在“调试”模式开头的符号),如果找到这样的行,则执行exit 1

这告诉git commit在启动$ EDITOR以编辑提交消息之前中止提交。

答案 3 :(得分:0)

我有一个名为dirty的Perl程序可以检测回购中的新文件或已更改的文件,然后我可以说grep string_to_find $(dirty)

#!/usr/bin/perl

use warnings;
use strict;

my @lines = qx/svn status 2>&1/;
exit if @lines == 0;

chomp @lines;
my $first = $lines[0];
if ( $first !~ /svn: warning: .+ not a working copy/ ) {
    @lines = grep { !/^[?]/ } @lines; # Ignore unversioned files
    s/^........// for @lines;
    print "$_\n" for @lines;
    exit;
}

@lines = qx/git status --short --untracked-files=no/;
chomp @lines;
s/^...// for @lines;

print "$_\n" for @lines;

请注意,它很聪明,可以检查Subversion仓库或Git仓库中的脏文件,具体取决于它检测到的内容。

答案 4 :(得分:0)

以下是用于别名更改行的小别名:

    grep-changed = "!f(){ git diff-index -U -G \"$@\" HEAD; };f "
    grep-staged  = "!f(){ git diff-index -U --cached -G \"$@\" HEAD; };f "