git子模块foreach-首先递归提交子模块的健壮方法?

git子模块foreach-首先递归提交子模块的健壮方法?,git,foreach,git-submodules,Git,Foreach,Git Submodules,是否有一种健壮的方法来执行递归深度优先git子模块foreach命令?我使用的是foreach--recursive命令来完成这项工作,只是它是广度优先。这是一个问题,因为如果我有以下结构: A B C 我在这三个模块中都有提交,aforeach--recursive add-a&&git commit…将命中a、B、C,如果我希望超级模块在当时捕获B的提交,这是有问题的 我从2008年就发现了这些特性,但我现在的Git版本(1.7.9.5)中似乎没有任何建议的特性 我编写了一个小bas

是否有一种健壮的方法来执行递归深度优先
git子模块foreach
命令?我使用的是
foreach--recursive
命令来完成这项工作,只是它是广度优先。这是一个问题,因为如果我有以下结构:

  • A
    • B
  • C
我在这三个模块中都有提交,a
foreach--recursive add-a&&git commit…
将命中a、B、C,如果我希望超级模块在当时捕获B的提交,这是有问题的

我从2008年就发现了这些特性,但我现在的Git版本(1.7.9.5)中似乎没有任何建议的特性

我编写了一个小bash函数来实现这一点(请原谅缩写命名):

用以下奇特的命令测试它似乎是可行的:

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

这个命令看起来可靠吗,或者还有其他常见的现有方法吗?

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

测试的目的是检查它是否实现了一个以上深度的递归

A
  B
    D
  C

我在尝试输入单引号时遇到了您和我的命令的问题(无法编写它们有点糟糕)-使用多个级别的bash命令进行转义有点混乱

该(报价问题)应在Git 1.9/2.0(2014年第1季度)中简化,包括:

eval”$@“
”创建了一个额外的shell解释层,如果用户将多个参数传递给git子模块foreach,则可能不希望这样做:

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

示例:

  • 添加额外引用级别时的典型用法是传递一个参数,该参数表示要传递给shell的整个命令。
    这并不能改变这一点
  • 可以想象有人将不受信任的输入作为参数输入:
这目前会导致不明显的外壳代码注入漏洞。
直接执行由参数命名的命令(如本补丁中所述)可以修复该问题


自Git 2.21(2017年第2季度)以来,您已经有了

您可以试试这个

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

这个列表(递归地)列出所有子模块,然后颠倒列表,
tail-r
这样你就可以按照你想要的顺序得到目录(首先是孩子),进入目录,然后做你想做的任何事情。

有趣的,比我的答案更完整+谢谢你!不幸的是,虽然我没有
-r
选项(Ubuntu),但是通过
tac
命令。因此,使用不同的xargs风格,我想出了另一个变体:
git子模块foreach--recursive | tac | sed's/Entering/'| xargs-n1bash-c'cd$1&&git status'.
我一直在尝试我的方法,但如果我想在所有子模块上运行commit,然后在超级模块上运行commit,我相信会出错。稍后我将测试您的方法,看看它是否更健壮。一旦我测试过,我会回来的。很抱歉,我花了一段时间,但是我在尝试输入单引号时遇到了您和我的命令的问题(无法编写它们有点糟糕)-使用多个级别的bash命令进行转义有点让人困惑,哈哈。现在,我想下一个最好的选择是尝试提交git子模块的补丁,所以我会尝试一下。我测试了mb14和我的技术,它们似乎都能工作。我在pastebin上发布了一个命令。注意:一些命令现在知道子模块:例如,
git grep-e“bar”--recurse子模块
在git 2.12中可用:
 $ 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.
    git submodule foreach git grep "$variable"
git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit