如何使用git grep仅搜索一组文件扩展名

19

如何执行git grep并将检查的文件限制为一组文件。我想要grep .cpp和.h文件中的内容,查找MyFunc。

git grep "MyFunc" -- *.[hc]*

然而这也会匹配 .c 和 .cs 文件。

2个回答

19

使用:

git grep "MyFunc" -- '*.cpp' '*.h'

引号必须使用,这样git才能展开通配符,而不是由shell来展开。如果省略引号,git只会搜索当前目录中的文件,而不包括子目录。


1
看起来对我来说引号不是必要的... 不使用它们也能获取到深层目录中的文件。在 Windows 7 上使用 Git Bash。 - chtenb
要在您的存储库中进行递归搜索,请调用 git grep "MyFunc" -- **/*.cpp - Chris_128

7
在Windows中使用git bash时,可以通过以下方式实现:
git grep "MyFunc" -- *.{cpp,h}

甚至更简单:
git grep "MyFunc" -- *.cpp *.h

关于Git词汇表中的pathspec解释提到,使用fnmatch(3)进行模式匹配。该函数匹配模式(包括多个字符),如IEEE Std 1003.1-2001的Shell and Utilities卷,第2.13.1节所述,并导致基本正则表达式匹配多个字符,给了我第一个解决方案。

进一步研究通过查看glob文档,带来了第二个解决方案。


5
警告:*.{cpp,h}*.cpp *.h两者只会在当前目录下搜索文件,而不会在子目录中搜索,因为它们是由shell(而不是git)展开的。如果要包括子目录,请使用:'*.cpp' '*.h'(如果你想知道的话,*.{cpp,h}这种语法不起作用,因为git无法理解它)。 - John Mellor
也许这取决于您的 shell / 环境。在 Windows 上使用 GitBash(msysgit bash shell)对我有效。 - stk_sfr
即使在我的情况下很奇怪,它适用于特定的文件类型而不是特定的文件。或者它只能在某些深度级别上工作(在Mac上使用bash)。 - Atif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接