如何git grep主存储库及其所有子模块?

3zz*_*zzy 7 git grep git-submodules

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

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

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

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

我究竟做错了什么?

Von*_*onC 14

注意:使用Git 2.12(2017年第一季度),您将不需要任何git submodule foreach技巧.
只是:

 git grep -e "bar" --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

参见提交e6fac7f,提交74ed437,提交0281e48,提交4538eef,提交9ebf689,提交f9f4256,提交5688c28(2016年12月16日),并提交4ac9006,提交7241764,提交a1ae484,提交05b458c(2016年12月12日),由Brandon Williams(mbrandonw)提交.
请参阅Johannes Sixt()提交的e9a379c(2016年12月21日).(由Junio C Hamano合并- -提交55d128a,2017年1月18日)j6t
gitster

grep:可选择递归到子模块

允许grep识别子模块并递归搜索每个子模块中的模式.
这是通过分离进程以递归调用每个子模块上的grep来完成的.

仅对已由父项目初始化和检出的子模块进行递归.如果子模块尚未初始化并检出,则只需跳过它.

为了支持现有的多线程基础结构grep,每个子进程的输出都在strbuf中捕获,以便以后可以按顺序打印到控制台.

为了限制创建的theads数量,每个子进程的线程数量都是其父进程的一半(最小值为1),否则我们可能会有一个fork-bomb.

git grep手册页现在包括:

--recurse-submodules
Run Code Online (Sandbox Code Playgroud)

递归搜索已在存储库中初始化和检出的每个子模块.
当与<tree>选项结合使用时,所有子模块输出的前缀将是父项目<tree>对象的名称.


使用Git 2.14.x/2.15(2017年第3季度)," 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 gitsterHamano合并- -提交5aa0b6c,2017年8月22日)

这意味着内部--parent-basename <basename>选项git grep不再存在.


确保使用Git 2.21(2019年第一季度),因为已经修复了关于cywin路径的错误:请参阅" Cygwin使用环境变量的相对和绝对路径 ".


Von*_*onC 3

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

但就您而言,由于周围有双引号,这应该按预期工作。
它确实可以在 Ubuntu 上的 git 1.8.4 上运行。

因此,简化您的.gitconfig并检查如果它包含您的别名(而不是其他任何内容)是否效果更好。
如果确实有效,则问题出在配置文件的其他位置。