如何在git repo中grep文件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在git repo中grep文件?相关的知识,希望对你有一定的参考价值。
我喜欢git grep
搜索签入回购的所有文件。这很棒。但是可以使用它(或其他一些git命令)来查找文件(独立于内容)吗?
目前我这样做:
$ find . | grep middleware
哪个有效,但它不使用git索引,这意味着它会遍历每个找到的文件,并报告与.gitignore
匹配的文件。
任何聪明的技巧的想法?
也许你想要git ls-files
列出索引中的文件? (并自动调整git工作目录中的当前目录)
我认为git ls-files
会为你做这个伎俩。
所以:
git ls-files "*middleware*"
在这种情况下,您可能会考虑使用非git解决方案。
find
本身有能力以更有效的方式做你想做的事情,而不是把结果输入grep
:
find . -name 'middleware*'
您需要引用模式,以便在传递给*
之前,shell不会扩展find
。
有一个名为ack
的强大程序,好吧,better than grep,我最喜欢的ack
用途之一正是你提到的 - 找到与树中的模式匹配的文件。 ack
使用perl regexps,而不是shell fileglobs。
ack -g middleware
如果你想在这些文件中搜索,ack
可以让你比在每个文件中find
s的grep
结果上写一个shell循环更容易。比较两者,看看你喜欢哪一个:
for f in $(find . -name 'middleware*')
do
grep 'pattern in file' $f
done
与
ack -G 'middleware' 'pattern in file'
我强烈建议将ack
添加到您的工具包中。
我经常有同样的问题,我只是去攻击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中(许可证更加自由,你只需要一个mksh
shell有点近期(50应该足够)版本,但它现在是最广泛的Unix shell,所以没关系)。
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'
以上是关于如何在git repo中grep文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 package.json 文件中添加 git repo
如何在 Windows 7 中删除 git 本地 repo 文件夹