问题 如何git grep只有一组文件扩展名


如何执行git grep并将检查的文件限制为一组文件。我希望能够grep查找MyFunc的.cpp和.h文件的内容。例如:

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

但是,这也匹配.c文件和.cs文件。


1595
2018-02-06 09:59


起源



答案:


使用:

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

引号是必要的,以便git扩展通配符而不是shell。如果省略它们,它只会搜索当前目录中的文件,而不是包含子目录。


11
2017-10-17 12:36



似乎引号对我来说不是必需的......不使用它们也可以从目录深处获取文件。在win 7上使用git bash - Chiel ten Brinke


答案:


使用:

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

引号是必要的,以便git扩展通配符而不是shell。如果省略它们,它只会搜索当前目录中的文件,而不是包含子目录。


11
2017-10-17 12:36



似乎引号对我来说不是必需的......不使用它们也可以从目录深处获取文件。在win 7上使用git bash - Chiel ten Brinke


这可以通过以下方式在Windows中使用git bash时实现:

git grep "MyFunc" -- *.{cpp,h}

甚至更简单:

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

关于路径规范的解释 git词汇表 提到模式匹配使用 的fnmatch(3)。其匹配模式(包括多个字符)如下所述 壳牌和公用事业量IEEE Std 1003.1-2001,第2.13.1节 并导致 匹配多个字符的基本正则表达式 并给了我第一个解决方案。

进一步的研究通过查看文档来引导我到第二个解决方案 glob的


4
2018-02-06 09:59



警告:两者都有 *.{cpp,h} 和 *.cpp *.h 只搜索当前目录中的文件,而不是在子目录中,因为它们是由shell(而不是git)扩展的。而是要包含您应该使用的子目录: '*.cpp' '*.h' (如果你想知道, '*.{cpp,h}' 不起作用,因为git不理解该语法)。 - John Mellor
也许这取决于你的shell /环境。这个答案适用于我在Windows上使用GitBash(msy​​sgit bash shell)。 - stk_sfr
在我的情况下甚至很奇怪,它适用于特定的文件类型而不是特定的。或者它可能在一些深层工作,就是这样(在mac上使用bash) - Atif Mohammed Ameenuddin