Git命令删除上游删除的本地分支?

时间:2017-01-11 13:25:08

标签: git

有很多类似的问题(例如this onethis one),但接受的答案似乎没有回答我的确切问题。

Branch1未合并为master。机器A和机器B都指向同一个遥控器。 Branch1存在于该遥控器上。

On Machine A我在本地删除Branch1并将删除推送到远程,以便从机器A中删除Branch1和remotes / origin / Branch1,并从远程删除Branch1。

在机器B上我运行

  • git checkout Branch1然后
  • git checkout Branch2然后
  • git fetch --prune

git fetch --prune从机器B上的本地存储库中删除了remotes / origin / Branch1。如果我然后通过运行git checkout Branch1返回Branch1,我收到错误消息

  

切换到分支' Branch1'
  您的分支机构基于&origin; Branch1',但上游已经消失     (使用" git branch --unset-upstream"来修复)

是否有git命令删除已删除上游的本地分支?

3 个答案:

答案 0 :(得分:1)

Whymarrh's comment是正确的:没有内置命令来执行此操作。

有一个很好的理由也没有这样的内置。仅仅因为上游远程跟踪分支已被修剪并不意味着您已经准备好抛弃您自己的工作。在您的示例中,可能在git fetch --prune删除origin/Branch1之前,也许,提交图片图片看起来像这样:

...--o--o--o     <-- origin/Branch1
            \
             o   <-- Branch1

你在Branch1做了一个好的提交,并准备好git push它,但上周被打断了。既然origin/Branch1已经消失了,也许你想在其他地方复制这个好的提交。但是现在origin/Branch1已经消失,没有理由在图中保持扭结,所有Git都可以看到:

...--o--o--o--o   <-- Branch1

它知道你的Branch1有一个配置的上游,但它不知道上游指向哪个提交,当它存在时返回。

尽管如此,如果您确定要删除此类分支,可以通过简短的脚本执行此操作:

#! /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) || continue
    # 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

(以上是未经测试的;也不会,因为你不能删除当前的分支,所以你需要确保你在一个你不想要的分支上删除)。

答案 1 :(得分:0)

git remote prune origin --dry-run

删除--dry-run以实际执行修剪。来自docs

  

删除name下的所有陈旧远程跟踪分支。这些陈旧的   分支已从远程存储库中删除   由name引用,但仍在本地可用   “遥控/ name”。

答案 2 :(得分:0)

没有内置方法可以执行此操作,但是可以使用以下代码

git fetch -p && \ 
git for-each-ref --format '%(refname:short) %(upstream:track)' | \ 
  awk '$2 == \"[gone]\" {print $1}' | \
  xargs -r git branch -D

此命令由几部分组成:

  1. git fetch -p:确保远程分支是最新的
  2. git for-each-ref --format '%(refname:short) %(upstream:track)':这将以我们选择的格式返回git分支,其中我们既具有本地分支名称又具有上游分支(对于远程服务器所在的分支,它将为“ [gone]”)已删除)
    1. awk '$2 == \"[gone]\" {print $1}':过滤远程状态为“ [gone]”的分支并返回本地分支名称
    2. xargs -r git branch -D删除本地分支

您甚至可以通过运行以下命令将上述命令添加为git别名:

git config --global alias.gone "! git fetch -p && git for-each-ref --format '%(refname:short) %(upstream:track)' | awk '\$2 == \"[gone]\" {print \$1}' | xargs -r git branch -D"

此命令完成后,您可以执行git gone,它将删除已删除远程分支的本地分支。

您可以在this blog post

中阅读完整的说明。