使用 Git 2.12(2017 年第一季度),您无需任何git submodule foreach
技巧。
简单地:
git grep -e "bar" --recurse-submodules
请参阅提交 e6fac7f、提交 74ed437、提交 0281e48、提交 4538eef、提交 9ebf689、提交 f9f4256、提交 5688c28(2016 年 12 月 16 日)和提交 4ac9006、提交 7241764、提交 a1ae484、提交 05b458c(12 月 12 日),作者为Brandon Williams( 12 月 2 日mbrandonw
)。
请参阅Johannes Sixt ( )的提交 e9a379c(2016 年 12 月 21 日) 。(由Junio C Hamano 合并——在提交 55d128a中,2017 年 1 月 18 日)j6t
gitster
grep
: 可选地递归到子模块
允许grep
识别子模块并递归搜索每个子模块中的模式。
这是通过分叉一个进程来递归调用每个子模块上的 grep 来完成的。
递归仅发生在已由父项目初始化和签出的子模块上。如果一个子模块没有被初始化和检出,它会被简单地跳过。
为了支持现有的多线程基础架构grep
,每个子进程的输出都被捕获在 strbuf 中,以便以后可以按顺序打印到控制台。
为了限制创建的线程数,每个子进程都有一半的线程数作为其父进程(最少为 1),否则我们可能会有一个 fork-bomb。
git grep
手册页现在包括:
--recurse-submodules
在存储库中已初始化并签出的每个子模块中递归搜索。
当与<tree>
选项结合使用时,所有子模块输出的前缀将是父项目<tree>
对象的名称。
在 Git 2.14.x/2.15(2017 年第三季度)中,“ git grep --recurse-submodules
”已经过重新设计,以在子模块边界上提供更一致的输出(并且无需分叉单独的进程即可完成它的工作)。
请参阅提交 f9ee2fc、提交 2184d4b、提交 34e2ba0、提交 91b8348、提交 8fa2915、提交 f20e7c1、提交 b22e51c、提交 4c0eeaf(2017 年 8 月 2 日)和提交 ba43964,提交 3f13877(2017 年 7 月 18 日),作者:Brandon Williams(mbrandonw
)
(由Junio C Hamano 合并gitster
——在提交 5aa0b6c中,2017 年 8 月 22 日)
这意味着内部--parent-basename <basename>
选项git grep
不再存在。
确保使用 Git 2.21(2019 年第一季度),因为已修复有关 cywin 路径的错误:请参阅“ Cygwin 使用环境变量的相对和绝对路径”。
实际上,在Git 2.23.1/2.24(2019 年第四季度)之前,git grep --recurse-submodules
查看工作树文件的“”查看子模块中索引中的内容,而不是工作树中的文件。
这已经解决了。
请参阅Matheus Tavares ( ) 的提交 6a289d4(2019 年 7 月 30 日)。(由Junio C Hamano 合并 -- --在提交 3071797中,2019 年 8 月 22 日)matheustavares
gitster
grep
:修复子模块中的工作树案例
即使不使用git-grep
,运行也会导致子模块--recurse-submodules
的缓存。
这使得子模块跟踪文件中的所有修改在 grepping 时总是被忽略。grep
--cached
解决内部git grep
调用时尊重缓存选项的问题。
此外,添加测试以确保执行所需的行为。grep_cache()
grep_submodule()
" git grep --no-index
" 不应该受到.gitmodules
文件内容的影响,但是当--recurse-submodules
给出 " " 或设置 " submodule.recurse
" 变量时,它会受到影响。
不再有,使用 Git 2.25.1(2020 年 2 月)。
现在这些设置在 " --no-index
" 模式下被忽略了。
请参阅Philippe Blain ( ) 的commit c56c48d(2020 年 1 月 30 日)。(由Junio C Hamano 合并——在提交 556ccd4中,2020 年 2 月 12 日)见讨论。phil-blain
gitster
grep
--recurse-submodules
:如果--no-index
给出则忽略
帮助者:Junio C Hamano
签字者:Philippe Blain
由于 grep 在0281e487fd中学会了递归到子模块(“ grep
:可选地递归到子模块”,2016-12-16,Git v2.12.0-rc0 -批处理中列出的合并#6),使用--recurse-submodules
with--no-index
使得 Gitdie()
。
这是不幸的,因为如果submodule.recurse
在用户的 中设置,在Git 存储库内部或外部~/.gitconfig
调用git grep --no-index
会导致:
fatal: option not supported with --recurse-submodules
让我们允许一起使用这些选项,以便全局设置 submodule.recurse 不会阻止使用git grep --no-index
.
如果在存储库中使用 using--recurse-submodules
应该不会有任何影响--no-index
,因为 Git 将递归到签出的子模块目录,就像进入常规目录一样。