【问题标题】:How to prune local tracking branches that do not exist on remote anymore如何修剪远程不再存在的本地跟踪分支
【发布时间】:2012-10-15 09:38:54
【问题描述】:

使用git remote prune origin,我可以删除不再位于远程的本地分支。

但我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。

我该怎么做?

【问题讨论】:

  • 单线,跨平台,看起来不像猫睡在你的键盘上:npx git-removed-branches(试运行)或npx git-removed-branches --prune(真实)。您需要已经安装了 node.js。详情请见answersbelow
  • 我通常认为这些事情应该故意而不是自动完成,否则你会打开自己删除不想删除的内容。所以我会坚持使用 git branch -d localBranchName 和 git push origin --delete remoteBranchName

标签: git


【解决方案1】:

这适用于我使用 git 2.21.0 - 它删除了合并到 HEAD 的本地跟踪分支,我之前在推送时使用了 --set-upstream(我使用 push.default=upstream,因为它最适用于多个遥控器)并且上游分支已被fetch --prune 删除(或在 git config 中隐式删除 fetch.prune=true):

git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d

使用--merged-d 使其成为非常“安全”的删除。更激进的版本可以放弃--merged 并使用-D

【讨论】:

  • 一个非常简单的相关且易于理解的解决方案,谢谢!
  • 请注意,您必须签出跟踪现有远程分支的分支,否则在管道到 xargs 之前的命令将返回 * 而不是分支名称。我的建议是使用git checkout master; git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d
【解决方案2】:

当遥控器本身不再存在时,我没有在这里找到有用的答案。 我不断看到不再存在的遥控器分支,但没有找到删除它们的 git 命令。

我的解决方案是去.git\refs\remotes目录,直接删除不再相关的文件。文件结构非常容易理解。它与您在git branch -r 中看到的结构相同。

【讨论】:

    【解决方案3】:

    检查目标

    for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do echo $target; done

    使用 for & 子命令运行

    for target in $(git branch | grep -Eiv "master|develop|branchYouWantToLive"); do git branch -D $target; done

    你可以扩展其他关于分支的东西。

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 2013-04-30
      • 2011-12-05
      • 2017-11-12
      • 1970-01-01
      • 2016-09-12
      • 2011-07-27
      • 2010-09-15
      相关资源
      最近更新 更多