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

时间:2016-06-06 18:17:15

标签: git git-fetch

有一次我认为git fetch origin --prune删除了服务器上不再存在的本地分支。不知怎的,这不是我目前的经历。

我运行了此命令,并且未删除本地分支。目前已检出 not 。我跑git branch -vv检查了这个信息,我看到了

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

所以它似乎知道它已经消失了。为什么不删除我的本地分支?

正在运行git version 2.7.4 (Apple Git-66)

5 个答案:

答案 0 :(得分:32)

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

如果远程跟踪分支不再存在,您需要手动删除不再需要的本地分支,或者更改或删除其上游设置。请注意,每个本地分支都可以记录现在甚至从未存在的远程和/或分支。在这种情况下,Git主要表现为那些本地分支没有上游集,除了从版本1.8.5开始,几个命令报告上游“已消失”或无效,并且可能建议使用--unset-upstream

1 更确切地说,它们在从命令行执行refspec映射或从配置执行fetch行后删除目标引用。因此,对于获取镜像,它们可以删除本地分支。但是,大多数克隆都没有设置为获取镜像。

最近有一些针对复杂映射的bug修复,以确保Git在某些情况下不会修剪映射分支。对于任何普通的存储库 - 普通克隆或纯获取镜像 - 这些修复都没有效果;只有当您有复杂的fetch配置时,它们才有意义。

答案 1 :(得分:9)

您想要的命令是

$ git remote prune origin

This question几乎是一字不差地提到你正在寻找的东西。

答案 2 :(得分:3)

这就是我使用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

答案 3 :(得分:1)

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

git branch --v | grep "\[gone\]" | awk '{print $1}' | xargs git branch -D
  • git branch --v 详细列出本地分支
  • grep“ [gone]” 查找所有远程分支都不存在的分支
  • awk'{print $ 1}'仅输出匹配的本地分支的名称
  • xargs git branch -D 删除所有匹配的本地分支

这应该可以在MacOS上与* nix环境一起使用。

答案 4 :(得分:0)

对我来说,这行有效:

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