如何在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