我喜欢
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*'
您需要引用该模式,以便
*
在传递给 find
之前不会被 shell 扩展。
有一个名为
ack
的强大程序,它比 grep 更好,而我最喜欢的 ack
用途之一正是您所提到的 - 查找与树中的模式匹配的文件。 ack
使用 Perl 正则表达式 (PCRE),而不是 shell 文件团。
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 解决方案
ack
git grep
手册页的示例。
git grep
在工作目录及其子目录中所有跟踪的 .c 和 .h 文件中查找 time_t。
来自选项描述。
git grep 'time_t' -- '*.[ch]'
如果给定,则将搜索限制为至少匹配一种模式的路径。支持前导路径匹配和 glob(7) 模式。
--
因此要翻译您的示例(其中不包含限制搜索的内容,因此我在此处添加了它):<pathspec>…
你会这样做:
find . -name '*.txt' | grep middleware
Git 现在已经有了成熟的搜索功能(正如前面的海报提到的)。您可以通过编程语言搜索文件名、扩展名。您可以在文件内容等内部搜索。
– 如果您不使用 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)如果文件列表不太长(必须在命令行上传递),这允许诸如…
git find -- -mtime -100
确实访问文件系统),但另一方面,几乎所有(不是搜索深度特定的东西)
find
都可以工作,并且您只能对“索引中的文件”进行操作”,即 git 已知(存在于 HEAD 提交或
find
ed 中)。不过,对于未解决的冲突有点挑剔。如果您发现任何问题,请给我留言(在这里,或通过 IRC)。
PS:请随意游说官方 git 人员对 git-find 存储库进行子树合并,我非常乐意将其集成到 git 中(许可证更加自由,您只需要
git add
shell 的版本较新(50 个应该足够了),但它是当今最广泛的 Unix shell,所以没关系)。