【问题标题】:Delete local Git branches if their remote-tracking references don't exist anymore [duplicate]如果远程跟踪引用不再存在,则删除本地 Git 分支 [重复]
【发布时间】:2017-11-12 15:30:27
【问题描述】:

我有一个本地和一个远程 Git 存储库。

  • 在我的本地存储库中,我创建并切换到一个新分支:git checkout -b feature/niceNewFeature

  • 我编写代码,git add .git commitgit push 我的 feature/niceNewFeature 分支到远程存储库(例如 GitHub)。

  • 在此之后,我创建了一个 GitHub 拉取请求,将 feature/niceNewFeature 分支合并到 master - 在审查代码后,我会这样做。

  • 由于feature/niceNewFeature现在合并到master,我将在GitHub上删除它。

  • 但是,在我的本地存储库中,如果我执行 git branch 命令,仍会列出 feature/niceNewFeature 分支。

我如何从本地存储库中删除 feature/niceNewFeature 分支,因为它已经合并到 master 并从远程存储库中删除?

【问题讨论】:

  • 将此命令与--purge标志git fetch --all --purge一起使用它将删除所有分支和标签等

标签: git github version-control branch git-branch


【解决方案1】:

简答:

git fetch --prune

git branch -lvv | cut -c3- | awk '/: gone]/ {print $1}' | xargs git branch -d

详细解答:

首先,删除遥控器上不再存在的所有远程跟踪引用:

git fetch --prune(或git fetch -p

如果你这样做,然后运行git branch -vv(详细),你会看到虽然feature/niceNewFeature 分支仍然列出,但上游分支现在已经“消失”了:

feature/niceNewFeature  832f7a7 [origin/feature/niceNewFeature: gone] Some commit message.

其次,让我们删除本地分支,使用以下命令:

git branch -lvv | cut -c3- | awk '/: gone]/ {print $1}' | xargs git branch -d

它的作用,基本上如下:

  1. 以详细模式 (vv) 列出所有本地 (-l) 分支(这几乎就像我们之前的输出一样)
  2. cuts 每行开头的第一个和第二个字符(空格)
  3. 使用awk,它会过滤“消失”的那些(/: gone]/),并获得它们的第一列({print $1})。请记住,“消失”意味着远程跟踪参考不再存在。
  4. 输出(这是要删除的分支的名称,在我们的例子中为feature/niceNewFeature)通过xargs 命令传送到git branch -d(删除),因此它将删除分支。请注意,分支必须完全合并到其上游分支中,因为只使用了-d 选项,而不是-D(即--delete --force)。

【讨论】:

  • 在我看来,这个答案比副本上接受的答案更好(但在那里也确实显示为附加答案)。
  • fwiw,(在我的机器上)这可以简化为git branch -vv | awk '/: gone]/ {print $1}' | xargs git branch -d(不需要-l 标志和cut 命令)
  • 考虑到单引号的 Bash 别名:alias youralias='git branch -lvv | cut -c3- | awk '"'"'/: gone]/ {print $1}'"'"' | xargs git branch -d'
【解决方案2】:

你可以这样做:

git remote prune origin

(如果 'origin' 是您的 github 远程的名称,否则替换为好名称)

【讨论】:

猜你喜欢
  • 2011-12-05
  • 2014-06-09
  • 2014-07-31
  • 2012-10-15
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多