dsh-branch-cleaner:在 DSH 里安全清理已落地 Git 分支

前言

在 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/* 等规则匹配项。

安全性与备份

  1. 默认只报告:mode=report 不执行 git checkout,不删分支。
  2. 操作范围:不 rebase、不切分支、不碰工作区;只读判定加 git branch -d/-D。
  3. 删前备份:每个被删分支的 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 覆盖不全带来的分支堆积问题。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye