2013-02-13 156 views
9

是否有强大的方法来执行递归深度优先git submodule foreach命令?我使用foreach --recursive命令来完成这项工作,除了它是宽度优先。这是因为如果我有以下结构的问题:git submodule foreach - 首先递归提交子模块的可靠方法?

  • 一个
  • Ç

而且我有承诺在所有三个,一个foreach --recursive add -A && git commit ...将达到,B,C,如果我想让supermodule捕获当时B的提交,这是有问题的。

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

我写了一个小bash函数来做到这一点(原谅简写命名):

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

并用以下奇特的命令测试它似乎工作:

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

做这个命令似乎健壮,还是有其他常见的现有方法?

+0

注意:有些命令现在知道子模块:例如'git grep -e“栏”--recurse-submodules“可用于Git 2.12:http://stackoverflow.com/a/41788645/6309 – VonC 2017-01-22 08:00:56

回答

3

我没有发现任何其他方式比您的功能执行深度优先foreach命令。

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

A 
    B 
    D 
    C 

试图把单引号(有点太烂不能够给他们写)的时候我一直有麻烦的你的和我的命令 - 多层次的bash的命令是逃逸有点混乱。

此(引号问题)应在GIT中被简化1.9/2.0(Q1 2014),与commit 1c4fb13Anders Kaseorg (andersk)

'eval "[email protected]"' 创建壳解释的额外层,这可能是不预计到谁传递多个参数与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. 

要解决此问题,如果用户传递多个参数,请直接执行“[email protected]”,而不是将它传递给eval

实例:

  • 引用添加一个额外的水平时典型用法是通过表示整个命令被传递到所述壳的单个参数。
    这不会改变这一点。
  • 可想而知有人馈送不可信的输入作为参数:
git submodule foreach git grep "$variable" 

即目前导致非显而易见的壳代码注入漏洞。
直接执行由参数命名的命令,如在此修补程序中修复它。

+0

我测试了mb14和我的技术,他们都似乎工作。我在pastebin上发布了一个[示例](http://pastebin.com/eHeYiya7)。 – eacousineau 2013-02-13 21:07:38

10

你可以试试这个

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

这份名单(递归)所有的子模块,然后反转列表,tail -r让你得到你想要的(孩子第一)的顺序,进入目录的目录并做任何你想要的东西。

+0

有趣,比我的答案更完整。 +1 – VonC 2013-02-13 15:19:49

+0

矿应该适用于任何深度 – mb14 2013-02-13 15:35:53

+0

感谢您的支持!不幸的是,我没有'-r'选项(Ubuntu),但通过[本文](http://stackoverflow.com/a/742485/170413),有'tac'命令。因此,用不同的xargs调味品,想出了另一种变体:'git submodule foreach --recursive | tac | sed's /进入//'| xargs -n 1 bash -c'cd $ 1 && git status'_' – eacousineau 2013-02-13 17:50:40