Bash 如何向git子模块foreach注入变量?

Bash 如何向git子模块foreach注入变量?,bash,git,git-submodules,Bash,Git,Git Submodules,我有两个问题,(1)如何将变量注入这个foreach循环?在下面的示例中,$user\u branch在第2行中不可访问 USER_BRANCH="foo" git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout $USER_BRANCH || gi

我有两个问题,(1)如何将变量注入这个
foreach
循环?在下面的示例中,
$user\u branch
在第2行中不可访问

USER_BRANCH="foo"
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout $USER_BRANCH || git checkout $branch' –
(2) 有没有办法让这个
foreach
成为一个常规循环

foreach $(git submodules --recursive); do
  #do something
  #more
  #and more
done

在回答第一个问题时,问题是您使用的是单引号,因此变量不会展开。切换到双引号应该可以修复这一部分

git submodule foreach -q --recursive "git checkout $user_branch"
对于第二个问题,建议您可以在每个模块中运行任意shell命令,因此虽然您不能像bash For循环那样构造它,但您可以运行shell脚本或由
连接的多个命令

foreach[--递归]

计算每个签出子模块中的任意shell命令。该命令可以访问变量$name、$path、$sha1 $toplevel:$name是中相关子模块节的名称 .gitmodules,$path是相对于的子模块目录的名称 超级项目$sha1是超级项目中记录的提交, $toplevel是指向项目顶层的绝对路径 超级项目。超级项目中定义的任何子模块,但不包括 此命令将忽略已签出的。除非给予——安静,foreach 在计算命令之前,打印每个子模块的名称。如果 --给定递归,子模块递归遍历(即给定的shell命令也在嵌套子模块中求值)。A. 任何子模块中命令的非零返回都会导致 要终止的处理。可以通过将| |:添加到 命令结束


非常感谢,我将不得不做一些类似于
git子模块foreach-q--recursive'branch=“$(git config-f$toplevel/.gitmodules子模块.$name.branch)”;[“$branch”=”]&&git checkout$USER\u branch | | git checkout$branch'-
,不知道如何将单引号替换为双引号“在此,有什么帮助吗?
git子模块foreach-q——递归“branch=”$(git config-f$toplevel/.gitmodules子模块.$name.branch)\”;[-z\“$branch\”]&&git checkout$USER|branch | git checkout$branch”
-用反斜杠将dquotes中的dquotes转义。@rodee,如果您正在做一些中等复杂的事情,我会将其包装在shell脚本中。