为何`git checkout -`在Makefile中表现异常?
解决Makefile中
git checkout -不生效的问题 首先,咱们先揪出核心问题:Makefile里的每一行命令默认都是在单独的子Shell进程中执行的!这就意味着你执行git checkout -的时候,确实在那个子Shell里切换了分支,但这个子Shell执行完就退出了,后续的命令又回到了原来的Shell环境(也就是develop分支),看起来就像没切换一样——这和你在Bash直接执行的区别在于,Bash里所有命令都在同一个Shell进程里,分支状态会持续保留。
接下来回答你提到的两个小问题:
关于双美元符号
你说的没错!在Makefile中,$是用来引用Make变量的特殊字符,如果你要在Shell命令里使用命令替换(比如$(git status...))或者Shell变量,必须写成$$,这样Make才会把它解析成单个$传递给Shell执行。你的$$(git status --porcelain | wc -l)写法是完全正确的。
关于if语句和分支切换的修复
要让分支切换生效,你需要把所有需要在同一个Shell环境下执行的命令合并起来——可以用&&连接,或者用反斜杠\换行(注意反斜杠后面不能有空格),确保它们在同一个子Shell里运行。比如把你的rebase目标改成这样:
SHELL := /bin/bash rebase: git stash && \ git checkout develop && \ git pull --rebase origin develop && \ if [ $$(git status --porcelain | wc -l) -eq 0 ]; then \ git checkout - && \ git rebase develop && \ git stash pop; \ fi
这里需要注意几个细节:
- 用
&&连接命令可以保证前一个命令执行成功才会执行下一个,避免出错后继续执行后续命令 - if语句跨行时,每一行末尾必须加
\,而且fi要单独占一行(或者用分号和前面的命令连起来) [ ]内部的空格不能少,比如[ $$(...) -eq 0 ],括号和内容之间、比较符两边都要有空格
这样修改后,所有命令都在同一个Shell进程里执行,git checkout -切换分支的状态就会被后续命令继承,就能正常工作了。
内容的提问来源于stack exchange,提问作者holms
相关产品推荐
相关产品推荐

