git submodule foreach - 首先递归提交子模块的强大方法?

eac*_*eau 11 git foreach git-submodules

是否有一种强大的方法来执行递归深度优先git submodule foreach命令?我正在使用完成工作的foreach --recursive命令,除了它是广度优先.这是一个问题,因为如果我有以下结构:

  • 一个
  • C

我有三个提交,一个foreach --recursive add -A && git commit ...命中A,B,C,如果我希望超模块在那个时候捕获B的提交,这是有问题的.

我在2008年发现了这个讨论,但它看起来并不像我当前版本的Git中的任何建议功能(1.7.9.5).

我写了一个小的bash函数来做这个(原谅速记命名):

function git-sfed() { git submodule foreach "git submodule foreach '$*' && $*"; }
Run Code Online (Sandbox Code Playgroud)

使用以下fanciful命令测试它似乎工作:

git-sfed 'python -c "import sys; print sys.argv" $path'
Run Code Online (Sandbox Code Playgroud)

此命令看起来是否健壮,或者是否存在其他常见的现有方法?

mb1*_*b14 14

你可以试试这个

git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit
Run Code Online (Sandbox Code Playgroud)

这个列表(递归地)所有子模块,然后反转列表,tail -r所以你按照你想要的顺序(孩子们的第一个)获得目录,输入目录并在其中做你想做的事情.


Von*_*onC 3

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

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

A
  B
    D
  C
Run Code Online (Sandbox Code Playgroud)

当我尝试输入单引号时,我一直遇到你和我的命令的问题(有点糟糕,无法编写它们) - 使用多个级别的 bash 命令转义有点令人困惑。

这个(引用问题)应该在 Git 1.9/2.0 (Q1 2014) 中得到简化,并由Anders Kaseorg (andersk)提交 1c4fb13

' eval "$@"' 创建了额外的 shell 解释层,这对于将多个参数传递给 git 子模块 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.
Run Code Online (Sandbox Code Playgroud)

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

例子:

  • 添加额外级别的引用时的典型用法是传递一个表示要传递到 shell 的整个命令的参数。
    这并没有改变这一点。
  • 人们可以想象有人将不受信任的输入作为参数:
    git submodule foreach git grep "$variable"
Run Code Online (Sandbox Code Playgroud)

目前这会导致一个不明显的 shell 代码注入漏洞。
直接执行由参数命名的命令(如本补丁所示)可以修复该问题。


自 Git 2.21(2017 年第 2 季度)以来,您已经git grep -e "bar" --recurse-submodules