12

Is there a robust way to do a recursive depth-first git submodule foreach command? I am using the foreach --recursive command which does the job, except it is breadth-first. This is a problem because if I have the following structure:

  • A
    • B
  • C

And I have commits in all three, a foreach --recursive add -A && git commit ... will hit A, B, C, which is problematic if I want the supermodule to capture the commits of B at that time.

I found this discussion from 2008, but it does not look like any of the suggested features are in the current version of Git that I have (1.7.9.5).

I wrote a small bash function to do this (excuse the shorthand naming):

function git-sfed() { git submodule foreach "git submodule foreach '$*' && $*"; }

And testing it with the following fanciful command seems to work:

git-sfed 'python -c "import sys; print sys.argv" $path'

Does this command seem robust, or are there other common existing methods?

4

2 回答 2

15

你可以试试这个

git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit

此列表(递归)所有子模块,然后反转列表,tail -r因此您可以按照您想要的顺序获取目录(首先是子模块),输入目录并在其中做任何您想做的事情。

于 2013-02-13T14:58:40.047 回答
3

除了您的函数之外,我没有找到任何其他方法来执行深度优先foreach命令。

测试将检查它是否确实实现了深度超过一的递归。

A
  B
    D
  C

我在尝试使用单引号时遇到了你和我的命令的麻烦(不能写它们有点糟糕) - 使用多个级别的 bash 命令转义有点令人困惑。

这个(引用问题)应该在 Git 1.9/2.0(2014 年第一季度)中简化,来自Anders Kaseorg (andersk)的提交 1c4fb13

' eval "$@"' 创建了一个额外的 shell 解释层,这可能是向 git submodule foreach 传递多个参数的用户所不期望的:

 $ git grep "'"
 [searches for single quotes]
 $ git submodule foreach git grep "'"
 Entering '[submodule]'
 /usr/lib/git-core/git-submodule: 1: eval: Syntax error: Unterminated quoted string
 Stopping at '[submodule]'; script returned non-zero status.

要解决此问题,如果用户传递了多个参数,$@请直接执行“”,而不是将其传递给eval.

例子:

  • 添加额外级别的引用时的典型用法是传递一个表示要传递给 shell 的整个命令的参数。
    这不会改变这一点。
  • 可以想象有人将不可信的输入作为参数提供:
    git submodule foreach git grep "$variable"

这目前导致了一个不明显的 shell 代码注入漏洞。
直接执行由参数命名的命令,就像在这个补丁中一样,修复它。


自 Git 2.21(2017 年第二季度)以来,您拥有git grep -e "bar" --recurse-submodules

于 2013-02-13T07:50:07.840 回答