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— 用于创建工作树的同级技能;该技能会在工作树成为孤儿后清理