git重新定位到上游,或者如果没有上游,则迁移到原点/主节点

问题描述 投票:0回答:1

我有一个git存储库,其中包含许多分支;有些是针对各种变更列表的跟踪分支,有些是“独立的”,通常只有跟踪的分支具有上游分支集。我想自动执行“为所有分支重新设置基础”的过程,因此,我想为每个分支执行的操作类似于(伪代码)

try:
  try:
    rebase
  except:
    rebase origin/master
except:
  pass

如果有必要,我可以使用一些嵌套的bash调用来做到这一点,并且对外部try使用bash(即忽略错误)是可以的,但是如果可能的话,我宁愿以git-native的方式进行内部调用。

git git-rebase upstream-branch
1个回答
0
投票

在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,则可以删除第一条分配行并使用最短的拼写。)

© www.soinside.com 2019 - 2024. All rights reserved.