是否可以git grep
只搜索索引/缓存中的新文件或修改文件?
(此用例是在预提交挂钩中使用,该挂钩会console.log
在预期提交中查找“调试”代码。但我不会被console.log
“现有”代码所困扰。最好这也无法匹配这些实例console.log
已被删除,但我可以忍受那些匹配!)
事实证明,做到这一点的方法不是通过git grep
,而是通过一个完全不同的命令,它也恰好能够搜索:git diff-index
。(简单性和正交性的另一个胜利......)
我想要的可以通过以下方式实现:
$ git diff-index -U --cached -G <regexp> HEAD
我通常只是做类似的事情:
git diff | grep TODO
如果您有足够多的更改线让这很烦人,那么我添加| grep '^+'
, 或开始使用-[ABC]
选项。
您可以创建一个 git pre-commit 钩子(它只是一个 shell 脚本,在您的 .git/hooks 目录中标记为可执行文件),它扫描您的提交差异以查找任何新添加的行(+
开头带有符号的那些用于“调试” " 模式),并执行一个exit 1
如果它发现这样的行。
这告诉git commit
您在开始 $EDITOR 以编辑提交消息之前中止提交。
我有一个名为的 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 存储库中的脏文件,具体取决于它检测到的内容。
这是 grep 更改行的小别名:
grep-changed = "!f(){ git diff-index -U -G \"$@\" HEAD; };f "
grep-staged = "!f(){ git diff-index -U --cached -G \"$@\" HEAD; };f "