如何在'git submodule foreach'中增加变量?

时间:2019-12-10 13:44:49

标签: bash git

我可以使用export CNT=1创建一个计数器变量。此外,我可以通过定义类似

的函数来增加它
$ function foo()
> {
>    export  CNT=$(($CNT+1))
>    echo $CNT
> }
$ export -f foo
$ foo
2

但是,当我尝试将其改编为git submodule foreach命令(git submodule foreach foo)时,我的计数器变量仍为'1'。

我想这与变量的可见性和新的shell实例的创建有关,但是我无法弄清楚它与git submodule foreach结合使用时的工作原理。

我很感谢任何回答,这给了我很好的解释。

顺便说一句:当然,我有几个子模块。

1 个答案:

答案 0 :(得分:1)

您怀疑,git submodule foreach在其自己的单独Shell实例中运行每个命令。这意味着子命令在任何一个特定子模块上完成操作后,所有变量或环境变量设置都将被丢弃。

最初,git submodule只是一个大的shell脚本。此脚本中的某些脚本仍保留为here。此脚本中的cmd_foreach函数调用builtin/submodule--helper.c,后者通过函数runcommand_in_submodule_cb运行指定的命令。

要实现所需的目标(所有子模块都使用“全局”计数器)(也许是递归的),则需要将当前计数复制到每次新的Shell实例启动后都可以生存的状态。您可以使用固定文件名,例如/tmp/counter来保存变量,尽管这当然意味着您不能在不同的超级项目中并行运行单独的git submodule foreach-es。或者,您可以使用每个存储库文件,也许通过使用子模块帮助程序提供的$toplevel中的设置(考虑将$toplevel转换为哈希ID并使用/tmp/counter.$hash或类似的方法,或者-如果您自己的情况还可以的话-$toplevel中的固定文件名,这是当您开始整个操作时的当前工作目录)。

您可以使用以下命令导出某些变量的当前值:

echo VAR=$VAR > $file

然后只需简单地获取(.)文件即可恢复值:

. $file

请注意,这会带来潜在的安全问题(如果其他人可以在脚本运行时覆盖$file)。