如何在git repo中grep文件?

时间:2011-03-09 11:37:35

标签: git grep

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

目前我这样做:

$ find . | grep middleware

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

任何聪明技巧的想法?

6 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:22)

我认为git ls-files会帮你解决问题。

所以:

 git ls-files "*middleware*"

答案 2 :(得分:4)

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

find 本身能够以更有效的方式执行您想要的操作,而不是将其结果汇总到grep

find . -name 'middleware*'

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

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

ack -g middleware

如果您想在这些文件中搜索ack可让您比find grep的{​​{1}}结果更轻松地执行此操作在每个文件中。比较两者,看看你喜欢哪一个:

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

ack -G 'middleware' 'pattern in file'

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

答案 3 :(得分: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 add ed)。

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

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

答案 4 :(得分:0)

git现在已经具有成熟的搜索功能(如前面的海报所述)。您可以通过编程语言搜索文件名,扩展名。可以在文件内容中进行搜索...等。

登录GitHub时,您将在屏幕左上方的搜索字段中进行搜索。

有关详情,请参见: https://help.github.com/en/articles/searching-code

答案 5 :(得分:-2)

纯git溶液

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

来自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'