我有一个git存储库,其中包含许多分支;有些是针对各种变更列表的跟踪分支,有些是“独立的”,通常只有跟踪的分支具有上游分支集。我想自动执行“为所有分支重新设置基础”的过程,因此,我想为每个分支执行的操作类似于(伪代码)
try:
try:
rebase
except:
rebase origin/master
except:
pass
如果有必要,我可以使用一些嵌套的bash调用来做到这一点,并且对外部try
使用bash(即忽略错误)是可以的,但是如果可能的话,我宁愿以git-native的方式进行内部调用。
在shell表达式级别,从每个命令获得的所有信息都是退出状态。
git rebase
的退出状态,如果重新设置完全成功,则为零;如果以任何方式失败,则为非零。没有比这更具体的承诺。如果失败的方式是“命令正确,我们启动了进程但是遇到了合并冲突”,则应与“命令不正确,因为没有上游设置”来处理该错误。
因此,您需要的序列要求进行单独的测试:上游是否已设置,如果是,它是什么?
要测试某些任意分支的上游,请使用:
git rev-parse --symbolic-full-name $branch@{u}
例如:
$ branch=master
$ git rev-parse --symbolic-full-name $branch@{u}
refs/remotes/origin/master
或使用--abbrev-ref
省略refs/remotes/
部分。
如果未设置上游,则会得到此:
$ branch=dev
$ git rev-parse --abbrev-ref $branch@{u}
fatal: no upstream configured for branch 'dev'
$ echo $?
128
因此,如果有上游,则git rev-parse
的标准输出为非空(且退出代码为零),在这种情况下,上游为标准输出;或标准错误流收到错误,退出代码为非零,如果没有上游,则没有标准输出数据。
将其包装成shell-ese,我们得到:
branch=<whatever you choose> # HEAD is also allowed here!
upstream=$(git rev-parse --abbrev-ref $branch@{u} 2>/dev/null) || upstream=origin/master
git rebase $upstream # remember, rebase operates on HEAD
((@{u}
或@{upstream}
是Git 1.7.0中的新功能;如果您的Git较旧,则可以对上游设置的两个部分分别进行升级或使用git config --get
)。我认为不再有1.7版之前的Git出现,HEAD@{u}
可以缩写为简单的@{u}
,因此,如果要设置branch=HEAD
,则可以删除第一条分配行并使用最短的拼写。)