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

时间:2013-09-15 09:37:28

标签: git grep git-submodules

我在博客上发现了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

我做错了什么?

2 个答案:

答案 0 :(得分:12)

注意:使用Git 2.12(2017年第一季度),您不需要任何db.user.aggregate([ { $match: { userId: { $in: [ "123456","123457","123458" ] } } }, { $unwind: '$interestedTags' }, { $group: { _id: '$interestedTags', countTags: { $sum : 1 } } } ]) 技巧 简单地:

git submodule foreach

请参阅commit e6fac7fcommit 74ed437commit 0281e48commit 4538eefcommit 9ebf689commit f9f4256commit 5688c28(2016年12月16日) ,commit 4ac9006commit 7241764commit a1ae484commit 05b458c(2016年12月12日)Brandon Williams (mbrandonw)。 请commit e9a379cJohannes Sixt (j6t)(2016年12月21日) (由Junio C Hamano -- gitster --合并于commit 55d128a,2017年1月18日)

  

git grep -e "bar" --recurse-submodules :可选择递归到子模块

     

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

     

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

     

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

     

要限制创建的theads数,每个子进程都有   一半的线程数作为其父项(最小为1),否则我们   可能有一个叉炸弹。

git grep man page现在包括:

grep
  

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

使用Git 2.14.x / 2.15(2017年第3季度),“<tree>”已被重新设计,以便在子模块边界内提供更一致的输出(并且无需分叉单独的进程即可完成此任务)。

请参阅commit f9ee2fccommit 2184d4bcommit 34e2ba0commit 91b8348commit 8fa2915commit f20e7c1commit b22e51c,{{3} (2017年8月2日),commit 4c0eeafcommit ba43964(2017年7月18日)commit 3f13877(由Brandon Williams (mbrandonw)合并于Junio C Hamano -- gitster --,2017年8月22日)

这意味着git grep --recurse-submodules的内部commit 5aa0b6c选项不再存在。

确保使用Git 2.21(2019年第一季度),因为已修复有关cywin路径的错误:请参阅“--parent-basename <basename>”。

答案 1 :(得分:3)

通常,类似于“GitConfig: bad config for shell command”,可能是因为'\'字符在被shell执行之前首先由git解释。

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

如此简化您的.gitconfig并检查是否包含您的别名(以及没有)其他更好。
如果确实有效,则问题出在配置文件的其他位置。