如何在 Git 存储库中 grep 文件?

问题描述 投票:0回答:6

我喜欢

git grep
搜索签入存储库的所有文件。这很棒。但是是否可以使用它(或其他一些 Git 命令)来查找文件(与内容无关)?

目前我这样做:

find . | grep middleware

它可以工作,但它不使用 Git 索引,这意味着它会遍历每个找到的文件,并报告与

.gitignore
匹配的文件。

有什么巧妙的技巧吗?

git grep
6个回答
47
投票

也许您想要

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


27
投票

我认为

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

所以:

 git ls-files "*middleware*"

6
投票

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

find
本身能够以比将结果管道传输到
grep
更有效的方式做你想做的事情:

find . -name 'middleware*'

您需要引用该模式,以便

*
在传递给
find
之前不会被 shell 扩展。

有一个名为

ack
的强大程序,它比 grep 更好,而我最喜欢的
ack
用途之一正是您所提到的 - 查找与模式中的模式匹配的文件树。
ack
使用 Perl 正则表达式,而不是 shell fileglob。

ack -g middleware

如果您想在这些文件中进行搜索,ack 可以让您比在每个文件中的

find
的结果上编写 shell 循环更容易。比较两者,看看您更喜欢哪一个:

grep

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

我强烈推荐

ack -G 'middleware' 'pattern in file'
 作为添加到您的工具包中的东西。

纯git解决方案


1
投票
ack

具有内置支持,可将 grep 限制为一组文件。

其他答案都使用外部工具来进行实际的 grep,这没有抓住要点。


来自 git grep

手册页

的示例。


git grep

在工作目录及其子目录中所有跟踪的 .c 和 .h 文件中查找 time_t。


来自选项描述。

git grep 'time_t' -- '*.[ch]'

表示选项结束;其余参数是限制器。

--
如果给定,则将搜索限制为至少匹配一种模式的路径。支持前导路径匹配和 glob(7) 模式。

因此要翻译您的示例(其中不包含限制搜索的内容,因此我在此处添加了它):

<pathspec>…​

你会这样做:

$ find . -name '*.txt' | grep middleware

git 现在已经有了成熟的搜索功能(正如前面的海报提到的)。您可以通过编程语言搜索文件名、扩展名..您可以在文件内容中搜索...等等。

1
投票

详情请参阅:

https://help.github.com/en/articles/searching-code

我经常遇到同样的问题,我只是去破解了


0
投票

– 如果您不使用 Debian 软件包

,您可以将 
git find 脚本复制到 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/\*
和朋友),以及两个全局选项,一个在 POSIX Basic(默认)和 POSIX Extended 之间切换正则表达式,另一个切换符号链接(默认打开);这仅查找文件(和符号链接),而不是设计的目录或子模块(“gitlinks”)。

它还可以将文件列表传递给常规

find(1)
如果文件列表不太长(必须在命令行上传递),这允许诸如…

-iname ...文件系统成本很小(

git find -- -mtime -100
确实访问文件系统),但另一方面,几乎所有(不是搜索深度特定的东西)
find

都可以工作,并且您只能对“索引中的文件”进行操作”,即 git 已知(存在于 HEAD 提交或

find
ed 中)。

不过,对于未解决的冲突有点挑剔。如果您发现任何问题,请给我留言(在这里,或通过 IRC)。

PS:请随意游说官方 git 人员对 git-find 存储库进行子树合并,我非常乐意将其集成到 git 中(许可证更加自由,您只需要

git add

shell 的版本较新(50 个应该足够了),但它是当今最广泛的 Unix shell,所以没关系)。


© www.soinside.com 2019 - 2024. All rights reserved.