前言¶
DSH 自帶的「Git / 文件變動」面板按會話工作目錄向下掃描來找倉庫。實際項目經常是若干個平級倉庫:主工作目錄下有一個 Git 倉庫,旁邊還有幾個同級倉庫。配套的 multi-root-workspace 插件能把它們登記成附加根,Agent 可以讀寫,但自帶面板仍然只顯示主倉庫的改動,其餘倉庫的變更在界面上完全看不到。
soulzhou/dsh-multi-root-changes 補的就是這一塊:讀取附加根的登記信息,對主根和每個附加根各跑一次只讀的 git status,在一個頁籤裏分組展示改動與提交歷史。下面介紹這個插件。
這是什麼¶
一個客戶端插件(作者 SoulZhou,版本 0.3.3,MIT 許可),給 DeepSeek Harness 側欄增加一個「多根改動」頁籤,覆蓋會話主工作目錄和所有已登記的附加工作目錄的 Git 改動。README 裏給出的實測例子:同一會話下三個倉庫分別有 4、5、35 個改動文件,面板合計顯示 44 個。
它依賴兩個宿主側的東西:
dsh-better-sidebar:頁籤通過它的ctx.betterSidebar.registerTab註冊,落在 DSH 自己的右側欄裏,所以這個依賴實際是必裝的。@dsh-electron/dsh-plugin-multi-root-workspace:附加根的來源。沒裝這個插件時,本插件退化爲只顯示主目錄。
核心功能¶
按根分組。主目錄和每個附加目錄各一節,顯示目錄名、分支、ahead/behind、增刪行數和文件數。改動路徑按 VS Code SCM 的方式折成目錄樹,單鏈目錄壓縮成一行(a/b/c)。重命名按 porcelain v2 的 2 記錄處理,顯示爲 舊 → 新,兩側路徑都進 pathspec。衝突(u 記錄)單獨標紅。新文件按「全文新增」渲染;二進制文件顯示爲「二進制文件 · N KB」。
行級 diff 與左右分欄。點文件讀該文件的 unified diff,含 hunk 頭和 +/- 行號。打開文件或提交時列表在左、預覽在右並排顯示,而不是上下堆疊,這樣側欄窄列裏文件樹仍然可讀。
每個目錄的提交歷史。每節下方可展開該倉庫自己的最近 30 條提交,顯示短 hash、作者、相對時間和 ref 徽章(如 HEAD -> master),點任意一條看該提交的 patch。三個平級倉庫各看各的歷史,互不混用。
提交與 AI 生成。每個有改動的目錄都帶一個提交框:可以手寫信息,也可以點 ✦ AI 生成 讓模型根據當前改動起草一條提交信息。提交只針對該目錄當前列出的文件,用 git add -- <files> + git commit -- <files>,不用 git add -A,不會把他人已暫存的內容一併帶走。
跟隨會話與省電。主根由宿主按 sessionId 解析,不用客戶端傳來的 cwd,切換會話或工作區時面板自動跟隨。頁籤不可見時停止輪詢(可見時 8 秒一次),因爲宿主會保留已訪問頁籤的掛載,不門控就會一直空轉。
不誤判倉庫歸屬。rev-parse --show-toplevel 與登記路徑不一致時,標爲「該目錄屬於另一個倉庫」,不會把父倉庫的改動算到這個目錄頭上。
實心底色。面板自己畫不透明的 layer-1 底色並建立獨立層疊上下文。主題類插件(如 dsh-background-studio 的毛玻璃)會把 --dsw-alias-bg-base 改成 transparent,面板若跟着透明,後面的對話會透出來,全屏時疊成錯位。這裏專門避免了這種情況。
安裝與啓用¶
安裝命令來自 README,指向本地目錄或已有副本:
dsh plugin --profile desktop add /path/to/dsh-multi-root-changes
也可以用 npm 包名或本地目錄,在 DSH 的「插件 → 添加插件」裏安裝。
裝完必須完全退出並重新打開 DeepSeek Harness,只刷新頁面不夠:宿主側的路由需要重新加載。
然後按順序裝好兩個依賴:dsh-better-sidebar 和 @dsh-electron/dsh-plugin-multi-root-workspace(後者決定附加根從哪來)。
用法¶
右側欄點 +,選「多根改動」,或在頁籤條裏切到它。
- 頂部顯示文件總數與刷新按鈕。
- 每個目錄一節,點標題摺疊或展開。
- 點文件在底部打開 diff,點
×關閉,點↻重讀。 - 展開某節底部的「提交歷史」,查看該倉庫自己的最近 30 條提交,點一條看 patch。
- 在提交框裏寫信息或點「✦ AI 生成」起草,再點「提交」。
訪問級別與安全¶
面板大部分時間在做讀操作,機制上只有提交是寫操作:
- 讀操作只有
status/rev-parse/log/show/diff,不改動任何東西。 - 唯一的寫操作是提交框的「提交」,對顯式列出的文件執行
git add -- <files>+git commit -- <files>,不用git add -A。 - AI 生成只讀:起草時只把當前目錄的 diff 和文件名餵給模型,由宿主
ctx.llm解析 provider,只取text-delta,模型的思考過程不會混進提交信息。本機沒有配置可用模型路由時會明確報出原因,而不是靜默失敗。 - 提交 hash 在進入命令行前只放行十六進制對象 id,不會被當作 flag 或 rev 表達式。
插件以當前 DSH 進程的權限運行。安裝前建議先檢查源碼和許可證(MIT)。
適用場景與注意¶
適合這樣的項目結構:會話主目錄是一個 Git 倉庫,另外還有若干同級獨立倉庫已經通過 multi-root-workspace 登記爲附加根,想在統一界面裏查看和提交它們的改動。
需要知道的邊界:
- 沒有暫存區操作(stage / unstage / discard),也不切換分支。提交框直接提交它列出的改動文件。
- 沒有完整的提交圖(泳道連線),只有線性列表和單提交 patch。分支樹、合併、變基等操作要用 better-sidebar 自帶的 Git 頁籤。
- 合併提交不顯示 patch(git 本身也要
-m纔有單一差異),只顯示元數據和父提交數。 - 附加根裏若登記的是另一個倉庫的子目錄,會被判爲「屬於另一個倉庫」而不是獨立倉庫——這是有意設計,避免把父倉庫的改動記到子目錄上。
- 資源上限:單文件 diff 2 MiB,未跟蹤文件預覽 1 MiB,單根條目 3000,每根提交 30 條,超出會明確提示截斷。
- Windows 下經受限 token 啓動的進程可能讀不到某些路徑,此時該目錄顯示讀取失敗原因,不會靜默消失。
結尾¶
這個插件的價值是把「多根登記但只能看主倉庫改動」的缺口補上:一個只讀爲主的面板,按根分組展示改動、diff、提交歷史和提交操作,不碰暫存區,也不越權到父倉庫。目錄頁在 https://www.skillhub.cn/plugins/SoulZhou/dsh-multi-root-changes,源碼在 https://github.com/SoulZhou/dsh-multi-root-changes。