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

时间:2013-02-13 05:28:57

标签: git foreach git-submodules

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

  • C

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

我从2008年开始发现了this discussion,但看起来我所拥有的当前版本的Git中没有任何建议的功能(1.7.9.5)。

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

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

使用以下fanciful命令对其进行测试似乎有效:

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

这个命令看起来是否健壮,还是有其他常见的现有方法?

2 个答案:

答案 0 :(得分:13)

你可以试试这个

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

这个列表(递归地)所有子模块,然后反转列表tail -r,这样你就可以按照你想要的顺序获得目录(孩子优先),输入目录并按照你想要的那样做。< / p>

答案 1 :(得分:3)

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

测试将检查它是否确实实现了多于一个深度的递归。

A
  B
    D
  C

  

当我试图输入单引号时,我一直遇到麻烦和你的命令(有点糟糕的是不能写它们) - 使用多级bash命令进行转义有点令人困惑。

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

  

'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代码注入漏洞   直接执行由参数命名的命令,就像在此补丁中一样,修复它。

相关问题