14

我在一个 grep 项目和子模块的博客上发现了这个:

[alias]
  sgrep = "!f() { git grep \"$1\"; git submodule foreach \"git grep '$1'; true\" | grep -B 1 \"$1\"; }; f"

我更新了我~/.gitconfig以包含它,但是当我使用别名时,它说:

fatal: bad config file line 9 in /home/myname/.gitconfig

我究竟做错了什么?

4

2 回答 2

25

使用 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-submoduleswith--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 将递归到签出的子模块目录,就像进入常规目录一样。

于 2017-01-22T07:59:45.770 回答
3

一般来说,类似于“ GitConfig: bad config for shell command ”,可能是因为 ' \' 字符首先被 git 解释,然后才在 shell 中执行。

但是在您的情况下,由于周围的双引号,这应该可以按预期工作。
它确实适用于我在 Ubuntu 上的 git 1.8.4。

因此,如果它包含您的别名(并且什么都没有),请简化您.gitconfig并检查是否效果更好。 如果这确实有效,那么问题就在您的配置文件中的其他地方。

于 2013-09-15T18:30:54.800 回答