是否可以让git grep
仅搜索索引/缓存中的新文件或已修改文件?
(用例是在预提交钩子中使用,在预期提交中查找console.log
等“调试”代码。但我不会被console.log
打扰在“现有”代码中。最好这也不能匹配删除的console.log
实例,但我可以使用匹配的代码!)
答案 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 "