如果本地 Git 分支的远程跟踪引用不再存在,则删除它们

Delete local Git branches if their remote-tracking references don't exist anymore

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

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

简答:

git fetch --prune

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

详细答案:

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

git fetch --prune(或git fetch -p

如果你这样做,然后你 运行 git branch -vv (详细),你会看到虽然 feature/niceNewFeature 分支仍然列出,但上游分支现在是 "gone":

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

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

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

它的作用基本上如下:

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

你这样做:

git remote prune origin

(如果 'origin' 是您的 github 遥控器的名称,否则替换为正确的名称)