通常当我发出
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 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
运行 shell 命令的 Git 别名始终在顶级目录中执行(请参阅
git config
手册页),因此您可以将其添加到您的 .gitconfig
文件中:
[alias]
rgrep = !git grep
或者,您可以使用
git rev-parse --show-toplevel
获取根目录,然后将其传递给 git grep
作为脚本或别名的基础:
git grep $pattern -- `git rev-parse --show-toplevel`
将此添加到您的 Git 配置文件中以创建一个
grepall
别名来执行您想要的操作:
[alias]
grepall = !git grep
(非本机别名,例如以
!
开头的别名,始终从存储库的顶层运行。)