如何在git repo中grep文件?
我喜欢如何在git repo中grep文件?,git,grep,Git,Grep,我喜欢git grep搜索所有签入repo的文件。太棒了。但是,是否可以使用它(或其他git命令)仅用于查找文件(独立于内容) 目前,我这样做: $ find . | grep middleware 它可以工作,但不使用git索引,这意味着它将遍历找到的每个文件,并报告与.gitignore匹配的文件 有什么好主意吗?也许你想要git ls文件列出索引中的文件?(并自动调整git工作目录中的当前目录)我认为git ls文件将为您带来好处 因此: 在这种情况下,您可以考虑非Git解决方案。 fi
git grep
搜索所有签入repo的文件。太棒了。但是,是否可以使用它(或其他git命令)仅用于查找文件(独立于内容)
目前,我这样做:
$ find . | grep middleware
它可以工作,但不使用git索引,这意味着它将遍历找到的每个文件,并报告与.gitignore
匹配的文件
有什么好主意吗?也许你想要
git ls文件
列出索引中的文件?(并自动调整git工作目录中的当前目录)我认为git ls文件
将为您带来好处
因此:
在这种情况下,您可以考虑非Git解决方案。
find
本身能够以比将结果导入grep
更高效的方式完成您想要的任务:
find . -name 'middleware*'
您需要引用该模式,以便在传递给find
之前,shell不会展开*
有一个功能强大的程序叫做ack
,也就是说,ack
的一个我最喜欢的用途就是你刚才提到的--在树中查找与模式匹配的文件<代码>确认使用perl regexp,而不是shell fileglobs
ack -g middleware
如果要在这些文件中搜索,ack
比在每个文件中的find
的grep
s的结果上编写shell循环更容易。比较两者,看看您更喜欢哪一种:
for f in $(find . -name 'middleware*')
do
grep 'pattern in file' $f
done
对
ack -G 'middleware' 'pattern in file'
我强烈推荐ack
作为添加到工具包中的工具。纯git解决方案
git grep
具有内置支持,可将grep限制为一个文件组其他答案都使用外部工具进行实际的灰显,这没有抓住要点。
来自git grep
的示例
在工作目录及其子目录中的所有跟踪的.c和.h文件中查找时间
从选项描述中
--
标志着选项的结束;其余的参数是限制器
…代码>
如果给定,则将搜索限制为至少匹配一个模式的路径。同时支持引导路径匹配和全局(7)模式
因此,为了翻译您的示例(其中未包含限制搜索的内容,因此我在此处添加了它):
你会做:
$ git grep middleware -- '*.txt'
我经常遇到同样的问题,我只是去黑客那里——如果你不使用,你可以将git find
脚本复制到/usr/lib/git core/
(或类似)并享受它
它可用于多种模式,其中最简单的模式是:
git find \*middleware\* # or
git find '*middleware*' # which is short for
git find -name '*middleware*'
组合也是可能的(并且几乎与常规的查找
一样灵活,您只需显式地编写-a
):
它还有几个选项,其中大多数用于过滤名称或完整(部分,即当前工作目录下)路径,其中一些不区分大小写(-iname
和friends),还有两个全局选项,一个用于在POSIX Basic(默认)和POSIX Extended之间切换regexp,另一个用于切换符号链接(默认打开);这仅查找文件(和符号链接),而不是按设计查找目录或子模块(“gitlinks”)
如果文件列表不太长(必须在命令行上传递),它还可以将文件列表传递给常规文件,这样可以实现以下功能
git find -- -mtime -100
…文件系统成本很低(find
确实访问了文件系统),但另一方面,几乎所有的find
都可以工作(不是搜索深度特定的东西),并且您只能对“索引中”的文件进行操作,即git已知的文件(位于提交头或git add
ed中)
不过,它对未解决的冲突有点挑剔。如果你发现它有任何问题,就给我写个便条(在这里,或者通过IRC)
PS:欢迎游说官方git人员对git find存储库进行子树合并,我非常乐意将其集成到git中(许可证更加自由,您只需要在最近的一段时间内使用mksh
shell(50个就足够了)版本,但它是当今最广泛使用的Unix shell,所以这没关系。git现在已经拥有成熟的搜索功能(正如前面的海报所提到的)。您可以按编程语言搜索文件名、扩展名。。你可以在里面搜索文件内容。。。等等
当您登录GitHub时,您可以在屏幕左上角的搜索字段中进行搜索
有关详细信息,请参见:
这是正确的答案。我会使用git-ls-files | grep“你要找的名字”来过滤git-ls-files将返回的文件的大列表。(我还将ls文件别名为ls,因为我经常使用它)我们可以使用命令git ls files“*.sh”
或git ls files | grep.sh
这样做,我早就有了别名:find=!git ls files | grep
,但有时我真的希望将搜索限制到特定路径,例如,git find foo bar/baz
。有什么想法可以实现吗?为了回答我自己的问题,下面是我提出的find=!sh-c'git ls files$2 | grep$1'-
@JFlo我在git find
中实现了您的请求,希望对您有所帮助+1美元。我总是用“git-ls tree-r HEAD | grep”来搜索“,”这也很酷,但是使用git-ls文件| grep…
我就可以从指尖上感受到grep的强大功能,而且由于我在grep上默认有颜色高亮显示,它显示得更好。@PeterBengtsson基本上是git-ls文件| grep
,但使用类似find的语法(它甚至可以委托查找,仍然避免使用非git文件)这并不能回答问题。OP要求的是git受限风格的find
,这与git grep
是git受限风格的grep
是一样的
$ git grep middleware -- '*.txt'
git find \*middleware\* # or
git find '*middleware*' # which is short for
git find -name '*middleware*'
git find \( -name \*.java -o -name \*.js \) -a ! -ipath \*/test/\*
git find -- -mtime -100