ce-clean-gone-branches

删除已删除远程跟踪分支的本地分支,包括任何关联的工作树。

ce-clean-gone-branches分支卫生 技能。 PR 合并到上游后,远程跟踪分支就会消失,但本地分支会无限期地存在,从而扰乱 git branch 并增加 git fetch 时间。此技能通过 git fetch --prune + git branch -vv 解析发现那些孤立的本地分支,显示列表,要求确认,然后删除它们 - 包括任何关联的工作树。

一个简单的高频实用程序。每当您的分支列表感觉嘈杂时就运行它。


TL;DR

问题 回答
它有什么作用? 发现远程跟踪分支为 : gone] 的本地分支,然后在确认后删除它们(首先是工作树,然后是分支)
何时使用它 “清理分支”、“删除消失的分支”、“修剪本地分支”——定期分支列表卫生
它生产什么 删除了工作树,删除了本地分支;没有做出任何承诺
范围 整个列表上是或否 - 没有每个分支的选择

## 问题

PR 合并后,本地分支累积:

  • git branch 变得嘈杂 — 30 多个本地分支机构,大多数代表已交付的工作
  • git fetch 和制表符完成变得更慢 — 更多参考文献可供枚举
  • 工作树孤儿 - 附加到长期合并分支的工作树保留其磁盘空间和工具开销
  • 手动清理很乏味git branch -vv | grep gone 然后是 git branch -D ,工作树处理分层在顶部
  • 自动生成的工作树名称worktree-jolly-beaming-raven 使得不清楚哪些孤儿属于哪个

解决方案

ce-clean-gone-branches 分三个阶段运行清理:

  • 发现git fetch --prune 刷新远程状态,然后解析 git branch -vv 以获得 : gone] 标记
  • 确认 — 显示完整列表,在整个列表上询问是或否(没有每个分支的选择)
  • 删除 — 对于每个分支,首先删除其工作树(如果存在),然后删除 git branch -D

一个简单的全有或全无的决定可以让技能保持快速。如果您只想删除一些分支,请拒绝并直接对您真正想要的分支使用 git branch -D


是什么让它如此新颖

1. 通过 git fetch --prune + : gone] 解析发现

该技能首先运行 git fetch --prune 以刷新远程状态的本地知识,然后解析 git branch -vv 以获得跟踪分支显示 : gone] 的分支 - 远程分支已删除的规范信号。如果没有修剪,本地裁判仍然会认为存在陈旧的远程分支;该技能从不依赖于用户最近是否修剪过。

2. 工作树感知清理

对于计划删除的每个分支,技能会检查 git worktree list 是否有关联的工作树。如果存在并且不是主存储库根,则在删除分支本身之前,首先通过 git worktree remove --force 将其删除。这避免了裸 git branch -D 会遇到的“无法删除分支 - 在工作树中签出”错误。

3. 全有或全无确认

用户看到完整列表并在整个列表上回答“是”或“否”。该技能提供多选或每分支选择。两个原因:

  • 列表通常很小(5-20​​ 个分支);见到他们所有人并说“是”的成本很低
  • 多选会增加 UI 开销,而这对于例行清理任务来说是无济于事的

如果用户想要更精细的控制,拒绝并运行 git branch -D <specific-branch> 会很快。

4. 实时报告

删除时,技能会打印每个操作 - “已删除的工作树:...”、“已删除的分支:...” - 因此用户可以实时看到进度。最终摘要命名了计数。


简单示例

您已经有一段时间没有清理本地分支机构了。您调用 /ce-clean-gone-branches

该技能运行 bash scripts/clean-gone,它通过修剪来获取并解析 git branch -vv。输出: 5 个消失的树枝。

这些本地分支已从远程删除:

- 壮举/通知静音
  - 修复/验证重定向
  - 重构/提取服务
  - 杂务/升级部门
  - 实验/新聚类

全部删除吗? (是/否)

你回答是的。该技能处理每个:

  • feat/notification-mute.worktrees/feat-notification-mute 有一个工作树。首先删除工作树:✓。删除分支:✓。
  • fix/auth-redirect 无工作树。删除分支:✓。
  • ...

最后总结:

删除了工作树:.worktrees/feat-notification-mute
删除的分支:feat/notification-mute
删除的分支:fix/auth-redirect
删除的分支:refactor/extract-service
删除的分支:chore/upgrade-deps
删除的分支:experiment/new-clustering

清理了5个分支。

何时去实现它

在以下情况下使用 ce-clean-gone-branches

  • 多个 PR 合并后,您的 git branch 列表变得嘈杂
  • 你注意到工作树在你不记得的分支上徘徊
  • 你已经有一段时间没有打扫卫生了;定期卫生已逾期

在以下情况下跳过 ce-clean-gone-branches

  • 您只想直接删除特定分支 → git branch -D <name>
  • 即使远程已消失,您仍想保留本地分支 → 拒绝提示
  • 您不在配置了远程的工作副本上 → 该技能需要远程来进行比较

用作工作流程的一部分

ce-clean-gone-branches 大部分是独立的——它不位于链内。它在以下情况下被调用:

  • 多个 PR 已合并,用户想要整理本地状态
  • 由于死枝上的孤立工作树,工作树创建失败
  • 用户正准备开始新的工作并希望重新开始

使用独立版

不带参数直接调用:

  • /ce-clean-gone-branches

该技能发现、询问和删除。没有标志,没有选择——完整列表上只有“是”或“否”。


## 参考

步骤 行动
1 运行 bash scripts/clean-gone (使用修剪获取,解析 : gone]
2 呈现陈旧分支列表;在整个列表中询问是/否
3 对于每个已确认的分支:删除工作树(如果存在),然后 git branch -D
4 发生删除时报告结果;最终总结与计数

如果脚本输出 __NONE__,则技能报告未找到陈旧分支并停止。


## 常问问题

什么是“消失”的分支? 其远程跟踪分支被上游删除的本地分支(通常是因为 PR 合并并且 GitHub 删除了源分支)。 git branch -vv 在此类分支旁边显示 : gone]

为什么全有或全无而不是按分支挑选? 因为列表通常很小,并且将它们全部查看需要几秒钟。多选 UI 会增加高频任务的阻力。如果您需要手术控制,请拒绝并针对特定分支使用 git branch -D <name>

为什么在删除分支之前先删除工作树? 因为签出分支(在工作树中)上的 git branch -D 失败。该技能首先删除工作树以避免该错误。

如果工作树有未提交的更改怎么办? --force 用于 git worktree remove,因此未提交的更改将被丢弃。如果分支已经“消失”(远程合并并删除),您几乎肯定不希望那里存在挥之不去的未提交更改。如果这样做,请拒绝提示并首先手动处理该工作树。

如果脚本失败或不返回任何分支怎么办? 如果不存在消失的分支,则该技能会干净地停止并报告“未找到陈旧的分支”。如果脚本本身出错,技能会显示错误。


另请参阅

  • /ce-worktree — 用于创建工作树的同级技能;该技能会在工作树成为孤儿后清理