Git分支因缺少遥控器而没有显示[消失]

时间:2019-10-31 21:12:00

标签: git

我一直在尝试找到一种通往delete local git branches with no upstream branch的方法,但是链接问题中的答案都对我没有作用。似乎他们都依靠git branch -vv输出gone]到没有远程分支的分支,但这对我来说不是,而且我不知道为什么。

例如,在运行get fetch --prune之后,git branch -vv将显示没有rsg/revert标签的分支[gone]

  rsg/revert                       af2c4ac81e Remove temporary debug logging

但是,没有相应的origin/rsg/revert分支(我已经在Github上将其删除)。有人知道为什么这行不通吗?

编辑:我在Mac上使用git 2.15.0。我以前从未遇到过问题。

2 个答案:

答案 0 :(得分:3)

您的Git已经足够新了,您已经运行了git fetch --prune,因此只剩下一个结论:rsg/revert的上游错误或根本没有上游。

要查看上游设置(如果没有设置,则显示错误),请像这样使用git rev-parse(请注意,某些shell可能需要引用大括号):

git rev-parse --abbrev-ref rsg/revert@{u}

例如:

$ git rev-parse --abbrev-ref master@{u}
origin/master
$ git rev-parse --abbrev-ref dev@{u}
fatal: no upstream configured for branch 'dev'

我的master的上游是origin/master,但是我的dev的上游没有设置。

在以下情况下,git branch -vv输出将在方括号中包含单词gone

  • 该分支有一个上游集,并且
  • 为该分支设置的上游不再引用有效名称。

因此,如果我以某种方式从自己的Git存储库中删除origin/master(我可以使用各种Git维护命令或git branch -d -r origin/master进行删除),我将得到:

$ git branch -d -r origin/master
Deleted remote-tracking branch origin/master (was 08da6496b6).
$ git branch -vv
  dev             9c9b961d7e The sixth batch
* master          08da6496b6 [origin/master: gone] Eighth batch

(然后我运行git fetch来进行新的提交并重新创建我的origin/master,现在是f21f8f5d35而不是08da6496b6。)

鉴于您让GitHub删除了rsg/revert,然后运行了一个git fetch -p删除了origin/rsg/revert的{​​{1}}分支,它的上游必须没有其他内容,或者什么也没有。 / p>

答案 1 :(得分:0)

如果这里有人需要它,我使用的解决方案是在 SO 上找到的其他几个答案的组合。

对于 DO 有上游的分支,当前问题中链接的问题非常有效。

至于缺少这种上游的分支,我选择了 this answer 的变体。

这是我使用的修改后的代码片段:

#! /bin/sh
#
# rm-if-gone: remove branches that have a configured upstream
# where the configured upstream no longer exists.  Run with
# -f to make it work, otherwise it just prints what it would
# remove.
force=false
case "$1" in
-f) force=true;;
esac

for branch in $(git for-each-ref --format='%(refname:short)' refs/heads); do
    # find configured upstream, if any
    remote=$(git config --get branch.$branch.remote) || true
    # if tracking local branch, skip
    if [ "$remote" = . ]; then continue; fi
    # if the upstream commit resolves, skip
    ucommit=$(git rev-parse "${branch}@{u}" 2>/dev/null) && continue
    # upstream is invalid - remove local branch, or print removal
    $force && git branch -D $branch || echo "git branch -D $branch"
done

完成的修改发生在第一个 || 中,当我们拿到遥控器时。如果没有找到遥控器,链接的答案会按原样离开分支。这正是我们感兴趣的情况,我们想要 SUPPRESS thewse 分支。因此,我们输出 true,因此该行不会以退出代码结尾。

请注意,此解决方案将抑制本地未链接到远程的任何分支(这包括您已启动但尚未推送的分支),因此请相应地使用,并且不要犹豫,首先在没有-f 选项。

希望这对某人有所帮助。