是否有一种强大的方法来执行递归深度优先git submodule foreach
命令?我正在使用foreach --recursive
命令执行此任务,除了它是广度优先。这是一个问题,因为如果我有以下结构:
我在这三个中都有提交,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'
这个命令看起来是否健壮,还是有其他常见的现有方法?
答案 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代码注入漏洞 直接执行由参数命名的命令,就像在此补丁中一样,修复它。