当我位于子目录中时,如何在整个树中 git grep ?

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

通常当我发出

git grep
时,它只会搜索当前目录及以下目录,例如

$ cat A
1
$ cd d
$ cat B
1
$ git grep 1
B:1
$ cd ..;git grep 1
A:1
B:1

我如何告诉

git grep
“搜索整个树,无论我当前所在的工作目录如何”?

git grep
3个回答
22
投票

:/
魔法之路

git grep pattern :/

适用于 Git 1.9.1,用于

git grep
此命令和其他命令,如以下所述:https://stackoverflow.com/a/31696782/895245 或者如果您感觉特别奇特:

git grep pattern :'(top)'

man git grep
表示
git grep
采用“pathspec”作为其路径*:

SYNOPSIS
       git grep ... [--] [<pathspec>...]

man gitglossary
解释了你可以用
<pathspec>
做的各种神奇的事情:

以冒号

:
开头的路径规范具有特殊含义。在简短形式中,前导冒号 : 后面跟着零个或多个“魔术签名”字母(可以选择以另一个冒号
:
结尾),其余部分是与路径匹配的模式。 “神奇签名”由 ASCII 符号组成,这些符号既不是字母数字、glob、正则表达式特殊字符,也不是冒号。如果模式以不属于“魔法签名”符号集且不是冒号的字符开头,则可以省略终止“魔法签名”的可选冒号。

top

魔术词 top(魔术签名:

/
)使模式从工作树的根开始匹配,即使您从子目录内部运行命令也是如此。

*:感谢评论中的Eric Allen


12
投票

运行 shell 命令的 Git 别名始终在顶级目录中执行(请参阅

git config
手册页),因此您可以将其添加到您的
.gitconfig
文件中:

[alias]
    rgrep = !git grep

或者,您可以使用

git rev-parse --show-toplevel
获取根目录,然后将其传递给
git grep
作为脚本或别名的基础:

git grep $pattern -- `git rev-parse --show-toplevel`

0
投票

将此添加到您的 Git 配置文件中以创建一个

grepall
别名来执行您想要的操作:

[alias]
    grepall = !git grep

(非本机别名,例如以

!
开头的别名,始终从存储库的顶层运行。)

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