如何在git repo中grep文件?

问题描述 投票:29回答:5

我喜欢git grep搜索签入回购的所有文件。这很棒。但是可以使用它(或其他一些git命令)来查找文件(独立于内容)吗?

目前我这样做:

$ find . | grep middleware

哪个有效,但它不使用git索引,这意味着它会遍历每个找到的文件,并报告与.gitignore匹配的文件。

任何聪明的技巧的想法?

git grep
5个回答
41
投票

也许你想要git ls-files列出索引中的文件? (并自动调整git工作目录中的当前目录)


22
投票

我认为git ls-files会为你做这个伎俩。

所以:

 git ls-files "*middleware*"

4
投票

在这种情况下,您可能会考虑使用非git解决方案。

find本身有能力以更有效的方式做你想做的事情,而不是把结果输入grep

find . -name 'middleware*'

您需要引用模式,以便在传递给*之前,shell不会扩展find

有一个名为ack的强大程序,好吧,better than grep,我最喜欢的ack用途之一正是你提到的 - 找到与树中的模式匹配的文件。 ack使用perl regexps,而不是shell fileglobs。

ack -g middleware

如果你想在这些文件中搜索,ack可以让你比在每个文件中finds的grep结果上写一个shell循环更容易。比较两者,看看你喜欢哪一个:

for f in $(find . -name 'middleware*')
do
    grep 'pattern in file' $f
done

ack -G 'middleware' 'pattern in file'

我强烈建议将ack添加到您的工具包中。


0
投票

我经常有同样的问题,我只是去攻击git find - 如果你不使用Debian package你可以将git-find脚本复制到/usr/lib/git-core/(或类似的)并享受它。

它可以用于几种模式,其中最简单的方式是:

git find \*middleware\*        # or
git find '*middleware*'        # which is short for
git find -name '*middleware*'

组合也是可能的(并且几乎和常规find一样灵活,你只需要明确地编写-a):

git find \( -name \*.java -o -name \*.js \) -a ! -ipath \*/test/\*

它有几个选项,其中大部分处理过滤名称或完整(部分,即在当前工作目录下)路径,其中一些不区分大小写(-iname和朋友),以及两个全局选项,一个用于切换正则表达式在POSIX Basic(默认)和POSIX Extended之间,另一个切换符号链接(默认开启);这只能找到文件(和符号链接),而不是设计目录或子模块(“gitlinks”)。

它也可以将文件列表传递给常规find(1),如果它不是太长(它必须在命令行上传递),这允许像......这样的事情。

git find -- -mtime -100

...以轻微的文件系统成本(find确实访问文件系统),但另一方面,find的几乎所有(不是搜索深度特定的东西)工作,你只能操作“索引”中的文件,即已知git(出现在HEAD提交或git added中)。

尽管如此,对于尚未解决的冲突有点挑剔。如果您发现任何问题,请给我留言(此处或通过IRC)。

PS:随意游说官方的git人员进行子树 - 合并git-find存储库,我非常乐意将它集成到git中(许可证更加自由,你只需要一个mksh shell有点近期(50应该足够)版本,但它现在是最广泛的Unix shell,所以没关系)。


-2
投票

Pure git solution

git grep具有内置支持,可将grep限制为一组文件。其他答案都使用外部工具来进行实际的grepping,这忽略了重点。

来自git grep man page的例子。

git grep 'time_t' -- '*.[ch]'

在工作目录及其子目录中的所有跟踪的.c和.h文件中查找time_t。

从选项说明。

--表示选项的结束;其余参数是限制器。

<pathspec>…​如果给定,则将搜索限制为与至少一个模式匹配的路径。两个前导路径匹配,并支持glob(7)模式。

所以要翻译你的例子(不包括限制搜索的东西,所以我在这里添加了它):

$ find . -name '*.txt' | grep middleware

你会这样做:

$ git grep middleware -- '*.txt'
© www.soinside.com 2019 - 2024. All rights reserved.