前言¶
在 DeepSeek Harness(DSH)里做智能体或日常开发时,仓库分支往往会越积越多。习惯用 git branch --merged 筛「已合并」分支的人很快会发现:squash merge、rebase 或 cherry-pick 落地的分支它认不出来;上游删了的分支、GitHub 上 PR 已合并但本地还挂着的情况也常被漏掉。手动对照主线和 PR 状态既费时,又容易误删还在用的分支。
下面介绍社区插件 dsh-branch-cleaner(维护者 ramwin),它在 DSH Web 里注册工具 git_clean_branches,用一套比 --merged 更完整的判定找出「工作其实已经进主线」的分支,默认只报告、删前自动备份。插件归类为工作流,源码与说明见 GitHub,也可在 SkillHub 目录页 查看条目。
这是什么¶
dsh-branch-cleaner 是 DeepSeek Harness 的冗余分支清理插件:找出已合并、已 squash 合并、补丁等价落地(rebase/cherry-pick)、上游已删、或 PR 已合并的 git 分支,在确认后可删除;默认 mode=report 只列清单,不改动任何分支。底层判定与删除逻辑来自仓库内脚本 assets/delete_redundant_branch.sh(与 linux-reference 中同脚本同步),插件负责把对话参数转成命令行、在会话工作目录执行并解析 JSON 给模型。许可证 MIT,npm 包版本 0.1.1(见仓库 package.json),要求 Node.js >= 20。
和 git branch --merged 差在哪¶
README 用表格概括了几种「落地方式」与插件判定手段,核心如下:
| 落地方式 | --merged |
插件判定 |
|---|---|---|
| merge / fast-forward | 能认 | git merge-base --is-ancestor |
| squash merge | 不能 | git merge-tree --write-tree:合回主线后主线内容不变 → 已落地 |
| rebase / cherry-pick | 不能 | git cherry:无 + 开头行 → 补丁已在主线 |
| PR 已合并 | 视落地方式 | gh pr list --head <branch> --state merged(可选) |
| 上游分支已删 | 不能 | %(upstream:track) 中的 [gone] |
squash 判定不会误杀:问的是「把这个分支合回去,主线会不会变」——会变则不删。
安装与启用¶
在 DSH 里用官方 README 中的命令安装(需使用 --profile web):
# npm
dsh plugin --profile web add dsh-branch-cleaner
# 或从 GitHub 装(跟随 main)
dsh plugin --profile web add github:ramwin/dsh-branch-cleaner
# 本地开发
dsh plugin --profile web add /path/to/dsh-branch-cleaner
装完后重开 dsh web 或刷新页面,模型侧会出现 git_clean_branches 工具。插件以当前 DSH 进程权限在会话工作目录执行 git 与脚本;安装前建议自行查看仓库源码与 MIT 许可证,确认符合团队安全策略。
典型用法¶
在对话里用自然语言即可,README 示例:
看看这个仓有哪些分支已经合过了,能删的列出来
把已经合并的分支删掉,保留 develop 和 release/*
常见流程是先 mode=report 列一遍,确认后再 mode=delete;也可在对话里明确要求一步到位删除。
工具参数要点¶
| 参数 | 说明 |
|---|---|
mode |
report(默认,只列不删)或 delete |
repo |
仓库路径,默认当前会话工作目录 |
base |
对比基线,默认 origin/HEAD,否则 main/master/当前分支 |
squash / patches / gone / pr |
分别开启 squash、rebase/cherry-pick、上游已删、gh PR 已合并判定 |
all |
等于 squash + patches + gone + prune(不含 remote) |
remote |
一并处理 origin 上可删的远程分支(需单独开启) |
prune |
先 git fetch --prune 刷新 [gone] |
age |
只处理 tip 提交早于 N 天的分支 |
keep |
额外保护的 glob,如 wip/* |
recurseSubmodules |
对已初始化子模块各跑一遍(仅本地,不带 prune/remote) |
timeoutMs |
协作式超时,默认 180000 |
默认已保护的分支包括基线本身、当前检出、任意 worktree 检出,以及 main、master、develop、trunk、release/*、hotfix/* 等规则匹配项。
安全性与备份¶
- 默认只报告:
mode=report不执行git checkout,不删分支。 - 操作范围:不 rebase、不切分支、不碰工作区;只读判定加
git branch -d/-D。 - 删前备份:每个被删分支的 SHA 写入
refs/backup/branch-cleaner/<时间戳>/<分支名>。查看与恢复示例:
git for-each-ref refs/backup/branch-cleaner/
git branch feat/x $(git rev-parse refs/backup/branch-cleaner/20260101-120000/feat/x)
输出里 branches / remoteBranches 每行带 repo 字段(. 为顶层仓库);递归子模块时未合并分支会汇总为「其余 N 个已略过」。
适用场景与注意¶
适合长期在 DSH 里维护多分支仓库、希望由模型代跑「可删分支审计」再人工确认的团队或个人。需要识别 GitHub PR 合并状态时,应本机已安装并配置好 gh。清远程分支务必显式打开 remote,不要误以为 all 已包含。子模块场景用 recurseSubmodules 时仅做本地清理逻辑。
社区插件目录(如 SkillHub)与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,选用第三方插件时以仓库 README 与源码为准。
链接¶
- 目录页:https://www.skillhub.cn/plugins/ramwin/dsh-branch-cleaner
- GitHub:https://github.com/ramwin/dsh-branch-cleaner
- npm:https://www.npmjs.com/package/dsh-branch-cleaner
经过上面的步骤,你可以在 DSH 对话里用 git_clean_branches 把「其实已经进主线」的分支找出来,在默认报告与备份机制下再决定是否删除,减轻 --merged 覆盖不全带来的分支堆积问题。