我一直在尝试找到一种通往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。我以前从未遇到过问题。
答案 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
选项。
希望这对某人有所帮助。