正如我在this post中提到的,我通常会递归地升级我的git子模块,如下所示:
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
从终端调用时,此命令可以正常工作。现在我很难将其嵌入到GNU make中,就像在this Makefile的upgrade
目标中一样。
如果我只是复制粘贴命令:
upgrade:
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
它不起作用:尽管存在简单的引号,GNU make尝试评估/解释$(git ...)
部分。到目前为止,我尝试了几次没有成功的尝试($$\(git ...)
,定义了一个逐字命令as explained here等)。
你有什么建议吗?
答案 0 :(得分:2)
在配方中唯一特殊的字符是$
(和反斜杠/换行符组合,但在换行符之前只有反斜杠,不在其他地方)。每个其他字符都被忽略并传递给命令。
并且引用$
的唯一方法是将其加倍,$$
。
因此,要引用$(git rev-parse ...)
,您只需撰写$$(git rev-parse ...)
即可。不需要反斜杠等。只需要使用shell命令和字面意思使用的每个$
,字符串中的任何位置,忽略所有类型的shell引用,将其设置为$$
。