我喜欢git grep
搜索签入回购的所有文件。这很棒。但是可以使用它(或其他一些git命令)来查找文件(独立于内容)吗?
目前我这样做:
$ find . | grep middleware
有效,但它不使用git索引,这意味着它会遍历每个找到的文件,并报告与.gitignore
匹配的文件。
任何聪明技巧的想法?
答案 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 grep,ack
我最喜欢的一个用途就是你所拥有的提到 - 查找与树中的模式匹配的文件。 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 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'