git fetch origin --prune 不删除本地分支?

git fetch origin --prune doesn't delete local branches?

有一次我认为 git fetch origin --prune 删除了服务器上不再存在的本地文件运行。不知何故,这不是我目前的体验。

我运行这个命令,本地的b运行ch没有被删除。目前签出。我 运行 git branch -vv 查看此信息,我看到

feature/MyGreatFeature           f30efc7 [origin/feature/MyGreatFeature: gone]

所以它好像知道它没了。为什么它不删除我的本地 b运行ch?

运行 git version 2.7.4 (Apple Git-66)

你想要的命令是

$ git remote prune origin

This question 几乎是您要查找的字词。

各种修剪选项(git remote update --prunegit remote prunegit fetch --prune删除远程跟踪分支。 1

您需要手动删除不再需要的本地分支,或者如果远程跟踪分支不再存在,则更改或删除它们的上游设置。请注意,每个本地分支都可以记录一个远程 and/or 分支,这些分支现在不存在,甚至从未存在过。在这种情况下 Git 主要表现为那些本地分支没有设置上游,除了自版本 1.8.5 以来,一些命令将上游报告为 "gone" 或其他无效,并且可能建议使用 --unset-upstream.


1更准确地说,他们在从命令行或配置中的 fetch 行执行 refspec 映射后删除目标引用。因此,对于获取镜像,它们可以删除本地分支。不过,大多数克隆未设置为获取镜像。

最近修复了一些复杂映射的错误,以确保 Git 在某些情况下不应该修剪映射的分支。对于任何普通存储库——普通克隆或纯获取镜像——这些修复都没有效果;只有当你有复杂的 fetch 配置时它们才重要。

以下命令链可用于删除本地分支:

git branch --v | grep "\[gone\]" | awk '{print }' | xargs git branch -D
  • git branch --v 详细列出本地分支
  • grep "\[gone\]"找到所有远程分支消失的分支
  • awk '{print }'只输出匹配的本地分支的名称
  • xargs git branch -D 删除所有匹配的本地分支

这应该适用于 MacOS 以及 *nix 环境。

对我来说,这条线有效:

git branch -vv | grep "gone" | awk '{print }' | xargs git branch -D

这就是我使用 Powershell 的方式。

PS> git branch --v | ? { $_ -match "\[gone\]" } | % { -split $_ | select -First 1 } | % { git branch -D $_ }

然后您可以创建别名,例如:

PS> Function func_gitprune { git branch --v | ? { $_ -match "\[gone\]" } | % { -split $_ | select -First 1 } | % { git branch -D $_ } }

PS> Set-Alias -Name gitprune -Value func_gitprune

并在每次需要时执行 运行

PS> gitprune

如果人们需要 PowerShell 版本:

git branch --v | Select-String -Pattern ".*\[gone\].*" | ForEach-Object{($_ -split "\s+")[1]} | ForEach-Object{git branch -D $_}