【问题标题】:git fetch origin --prune doesn't delete local branches?git fetch origin --prune 不删除本地分支?
【发布时间】:2016-10-06 11:06:00
【问题描述】:

在某一时刻,我认为git fetch origin --prune 删除了服务器上不再存在的本地分支。不知何故,这不是我目前的经验。

我运行了这个命令,本地分支没有被删除。目前已签出。我跑了git branch -vv 来检查这个信息,我明白了

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

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

运行git version 2.7.4 (Apple Git-66)

【问题讨论】:

标签: git git-fetch


【解决方案1】:

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

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


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

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

【讨论】:

  • 如果git branch -vv 上的[] 中列出了一个分支,那么在这种情况下它不是一个远程跟踪分支吗?
  • 不一定:[...] 中的东西只是上游。如果上游是远程跟踪分支,那么它很可能会被修剪。在您的示例中,您有[origin/feature/MyGreatFeature: gone],它看起来像一个已经被修剪的远程跟踪分支。 Git 仍然有本地分支feature/MyGreatFeature,并且在.git/config 中,该分支仍然将其远程设置为origin 及其上游设置。例如,您可以删除本地分支(删除其跟踪信息),或者如果您想保留本地分支而不设置上游,则在其上--unset-upstream
【解决方案2】:

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

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 环境。

【讨论】:

  • 这是一个很好的解决方案,但是现在 git 默认使用系统语言并且 [gone] 可能是不同的字符串
  • 这在 MacOS 和 *nix 中完美运行。如果有人正在寻找类似的 windows 功能,下面的命令会很有用: 1) git branch --v | find "[gone]" > tmpBranches.txt 2) for /f "tokens=1" %a in (tmpBranches.txt) do git branch -D %a 3) del tmpBranches.txt
  • 在其他线程上尝试了这么多解决方案之后,这最终对我有用。非常感谢!
【解决方案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

【讨论】:

  • 提前运行git fetch 会不会让您保持同步?类似& git fetch --prune; & git branch --v | ? { $_ -match "\[gone\]" } | % { -split $_ | select -First 1 } | % { git branch -D $_ }
【解决方案4】:

你想要的命令是

$ git remote prune origin

This question 几乎是您要查找的内容。

【讨论】:

  • 更多 git 分支/合并的疯狂,check this question out.
  • 当你说“不工作”时,你是什么意思?它因错误而失败?命令是否成功,但没有达到预期的效果?
  • 对它“成功”(没有输出)并且没有任何反应,分支仍然有“消失”标签
  • @jonathan: git remote prune origin 仅删除您的远程跟踪分支(例如remotes/origin/mybranch)。它不会删除您的本地分支(例如mybranch)。您必须单独删除它们。
【解决方案5】:

对我来说,这条线有效:

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

【讨论】:

  • 这里完全显示stackoverflow.com/a/59228595/571778,但解释较少
  • 有点不同 1. -vv VS --v 2. grep "gone" VS grep "[gone]"
  • 如果你把你的分支命名为gone
  • 我理解这个问题,但是当我使用“[gone]”时它对我不起作用,只有“gone”
  • @yano 那么你的分支将是gone
【解决方案6】:

如果人们需要 PowerShell 版本:

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

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 2019-10-30
    • 2014-02-14
    • 2021-08-10
    • 2013-12-05
    • 2014-03-28
    • 2011-04-30
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多