我可以使用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
结合使用时的工作原理。
我很感谢任何回答,这给了我很好的解释。
顺便说一句:当然,我有几个子模块。
答案 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
)。