如何在Bash脚本中获取Git当前分支并检查其是否存在于upstream远程?
脚本失效原因与修复方案
直接问题:单引号阻止变量展开
Bash语法中,单引号包裹的内容是纯字面量,不会解析内部的变量。你原脚本中写的egrep 'remotes/upstream/${MY_BRANCH}$',实际匹配的是字面字符串remotes/upstream/${MY_BRANCH}的行,${MY_BRANCH}根本没有被替换成master,自然无法匹配到实际存在的remotes/upstream/master行。
你手动执行git branch -a | egrep 'remotes/upstream/master'能正常生效,是因为引号内是硬编码的字面分支名,不需要做变量替换,和脚本里用变量的场景逻辑完全不同。
修复方式是将匹配规则的单引号换成双引号,让Bash正常展开变量:
# 错误写法 egrep 'remotes/upstream/${MY_BRANCH}$' # 正确写法 egrep "remotes/upstream/${MY_BRANCH}$"
另外你脚本中对MY_BRANCH执行的export操作属于冗余步骤,该变量仅在当前脚本流程内使用、没有传递给其他子进程的需求时,完全可以省略。同时推荐用$()替代传统的反引号做命令替换,嵌套支持更好、可读性更强。
关于远程分支同步的疑问
git branch -a 输出的远程分支列表,是本地缓存的、上次和远程仓库通信时留存的快照,不是实时的远程分支状态。如果本地没有和upstream远程同步过分支索引,哪怕upstream上真的存在对应分支,本地缓存里没有记录的话,也会出现匹配失败的情况。
因此:
- 如果依赖
git branch -a的输出做检测,必须在检测前执行git fetch upstream(或全量同步的git fetch --all),先刷新本地缓存的远程分支索引,再做匹配。 - 如果需要实时检测upstream上是否存在对应分支,不依赖本地缓存的话,可以直接用Git内置的远程查询命令,不需要提前fetch:
# 命令输出非空即说明upstream上存在对应分支 git ls-remote --heads upstream "$MY_BRANCH"
修复后的完整脚本示例
#!/bin/bash # 刷新本地upstream的分支缓存 git fetch upstream git checkout master MY_BRANCH=$(git rev-parse --abbrev-ref HEAD) # 用双引号包裹匹配规则,确保变量正常展开 git branch -a | egrep "remotes/upstream/${MY_BRANCH}$"
内容的提问来源于stack exchange,提问作者TheWaterProgrammer
相关产品推荐
相关产品推荐

