20

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

(此用例是在预提交挂钩中使用,该挂钩会console.log在预期提交中查找“调试”代码。但我不会被console.log“现有”代码所困扰。最好这也无法匹配这些实例console.log已被删除,但我可以忍受那些匹配!)

4

5 回答 5

19

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

我想要的可以通过以下方式实现:

$ git diff-index -U --cached -G <regexp> HEAD
于 2012-12-27T11:32:14.100 回答
13

我通常只是做类似的事情:

git diff | grep TODO

如果您有足够多的更改线让这很烦人,那么我添加| grep '^+', 或开始使用-[ABC]选项。

于 2012-12-20T09:45:15.600 回答
1

您可以创建一个 git pre-commit 钩子(它只是一个 shell 脚本,在您的 .git/hooks 目录中标记为可执行文件),它扫描您的提交差异以查找任何新添加的行(+开头带有符号的那些用于“调试” " 模式),并执行一个exit 1如果它发现这样的行。

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

于 2012-12-19T16:15:39.130 回答
1

我有一个名为的 Perl 程序dirty,它可以检测 repo 中的新文件或更改的文件,然后我可以说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 存储库中的脏文件,具体取决于它检测到的内容。

于 2012-12-19T15:27:14.653 回答
1

这是 grep 更改行的小别名:

    grep-changed = "!f(){ git diff-index -U -G \"$@\" HEAD; };f "
    grep-staged  = "!f(){ git diff-index -U --cached -G \"$@\" HEAD; };f "
于 2019-12-26T14:33:17.780 回答