前言¶
用 DeepSeek Harness(DSH)写代码或驱动智能体时,版本控制往往还要切到终端、IDE 或单独的 Git 客户端:看暂存区、对比 diff、写提交说明、翻历史。对话和中栏插件在同一窗口里,Git 却常占另一个应用,上下文来回跳。
社区插件 dsh-git-tree(维护者 chzisnull)把一套接近 Sourcetree 信息架构的 Git 工作区嵌进 DSH Web GUI:左侧工作区/分支/标签导航、已暂存与未暂存列表、结构化 diff,以及历史与搜索,占满与「插件」页同类的主面板中栏。当前包版本为 0.10.0(MIT),在 SkillHub 目录 归类为客户端插件;目录页展示的版本可能与仓库不一致,以 GitHub 发布与 package.json 为准。
这是什么¶
dsh-git-tree 是 DSH 的客户端插件:在左侧图标栏增加 Git 入口,打开全高 main 面板,在对话旁完成读状态、暂存、提交、看历史、fetch/pull/push 等日常操作,并可选调用 DSH 已注册的 LLM 生成提交说明或辅助解决单文件冲突。它不替代 DSH 的插件体系,而是社区目录里的一条独立条目,与 DeepSeek / 幻方无官方从属关系。
宿主侧用 ctx.subprocess 执行 git(不经 shell),客户端由 src/client/index.tsx 构建为 client.js,通过 Cordis patch 注册侧栏与主面板(共用 id git-tree)。
核心功能(0.10.0)¶
下面按 README 与状态表归纳已实现能力;未实现项文末单独说明。
面板与仓库¶
- 从 DSH 左侧
Git行进入main面板,沿用 DSH 中栏布局与深浅色主题(颜色均为--dsw-alias-*token,避免写死色值)。 - 工具栏仓库切换器列出 DSH 已注册的 workspace;可置顶,其余按切换频次与最近使用时间排序。
- 展示当前分支、upstream、ahead/behind、仓库根路径。
改动与 diff¶
- 改动分组对齐 Sourcetree:冲突 / 已暂存 / 未暂存,带计数;重命名保留原路径;同一文件两侧都有改动时两栏各出现一次(数据来自
git status --porcelain=v2 --branch -z)。 - diff 在宿主解析为 files → hunks → lines,界面双行号、hunk 头、整行底色与
+N −M;刻意不做语法高亮,与 Sourcetree 一致,突出「哪几行变了」。
写操作与边界¶
支持行内暂存/取消暂存、提交区提交(作者、分支、暂存数、⌘↵)、放弃更改、删除/清理未跟踪文件、本地分支新建/重命名/删除、检出(脏工作区会拒绝检出,不会自动 stash)、合并到当前分支。
推送当前分支到 upstream(首次推送可建立跟踪),永不 force;提交卡片可勾选「提交并推送」,推送失败不回滚提交。
获取 / 拉取:fetch 带 --prune 更新远端跟踪;pull 快进到 upstream,无 upstream 时尝试 origin/<同名分支>;面板打开时静默 fetch 一次;本地与远端分叉时会先确认再合并,冲突进入冲突视图。
写操作面刻意做小:无 reset --hard、无 force push、无 amend、无 rebase、无 stash 路由。
历史、搜索与分支¶
- 历史:泳道图、描述/短 SHA/作者/日期,支持「所有分支 / 仅当前分支」,每页 200 条。
- 提交详情:消息、作者、日期、父提交、refs、变更文件;可查看提交内单文件 diff。
- 搜索:按提交信息、作者或文件路径查提交。
- 分支侧栏:单击浏览历史、双击检出;右键含复制名称、从此提交建分支等。
AI 相关(走 DSH llm 服务)¶
- 生成提交信息:提交卡片 ✨ 按钮,根据本次将包含的文件 diff(有暂存用暂存,否则用工作区改动)填空;模型列表与 DSH 模型选择器同源,选择保存在
~/.dsh/git-tree/ai-settings.json(或$DSH_HOME/git-tree/ai-settings.json)。只填文本框,仍需人工点提交。 - 冲突:冲突文件展示
<<<<<<<标记行(ours/theirs 分色);「AI 解决」预览合并结果,应用后才写盘;可git checkout --merge还原,标记为已解决(git add)单独一步。
其它¶
- 面板可见时每 2 秒轮询状态,写操作后立即刷新。
- macOS 可在 Finder 中显示仓库、在终端打开。
- 尚未实现:远程分支与远端管理、右侧栏紧凑模式、rebase/stash/手工三向合并编辑器、大仓库虚拟滚动(明确不做)、与 Agent 共用操作。
安装与启用¶
安装命令以仓库 README.zh.md 为准。
从 npm 按包名安装(含宿主、客户端与 bundle patch):
dsh plugin --profile <profile> add dsh-git-tree
在带 plugin manager 的会话里也可:
plugin_manager action=install_bundle target=dsh-git-tree
从本地路径安装(示例路径以文档为准,请换成你的检出目录):
dsh plugin --profile <profile> add /Library/aiProject/dsh-git-tree
装完后需要重启 DSH(宿主半在 App 启动时装配)。在你主动暂存或提交之前,插件不会写你的仓库。
典型用法¶
- 在 DSH 中注册好目标项目的 workspace,安装并重启后,点左侧 Git 打开面板。
- 在顶部切换器选中仓库;左侧查看分支,中间处理已暂存/未暂存/冲突分组,右侧看结构化 diff。
- 勾选行或右键 暂存;在提交区写说明,或用 ✨ 让当前选中的 DSH 模型根据 diff 生成说明,确认后提交(可选勾选提交后推送)。
- 需要同步远端时,使用获取/拉取更新 ahead/behind,再推送;遇冲突在冲突视图中处理或尝试 AI 解决后手动标记已解决。
- 切到历史或搜索视图浏览提交;双击分支检出前请保证工作区干净。
面板打开后路由均带当前选中仓库的 cwd;具体 HTTP 路由见 README 中的「在 DSH 里怎么接」一节(如 GET /api/git-tree/status、POST /api/git-tree/commit 等),供排查集成问题时对照。
适用场景与注意¶
适合:主要在 DSH 里对话、写插件或驱动智能体,希望 Git 状态、diff、提交、历史与 fetch/pull/push 与对话同屏完成,且接受「无 rebase/stash/强推」的保守写操作集。
注意:
- 插件以当前 DSH 进程权限在宿主机执行
git与子进程;安装前请阅读 源码 与 MIT 许可证,确认路径校验、GIT_TERMINAL_PROMPT=0等行为符合你的安全预期。 - AI 功能会把所选文件的 diff 发给你在 DSH 里选的模型(diff 过大时会截断并标注);不另配 provider,凭据与限流遵循 DSH 自身配置。
- 社区目录 SkillHub 便于发现插件;星标与页面版本信息以站点展示为准,功能细节以 GitHub 0.10.0 文档为准。
结尾¶
dsh-git-tree 把 Sourcetree 式的 Git 信息架构搬进 DSH 主面板:仓库切换、分组改动、diff、历史搜索、受控的写操作与 fetch/pull/push,并复用 DSH 模型写提交说明、辅助单文件冲突合并。若你已在用 DSH 的「一切皆插件」工作流,可把 Git 从外置客户端收回到对话旁边。
- 目录页:https://www.skillhub.cn/plugins/chzisnull/dsh-git-tree
- 仓库:https://github.com/chzisnull/dsh-git-tree