dsh-multi-root-changes:把多倉庫 Git 改動收進一個面板

前言

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(後者決定附加根從哪來)。

用法

右側欄點 +,選「多根改動」,或在頁籤條裏切到它。

  1. 頂部顯示文件總數與刷新按鈕。
  2. 每個目錄一節,點標題摺疊或展開。
  3. 點文件在底部打開 diff,點 × 關閉,點 ↻ 重讀。
  4. 展開某節底部的「提交歷史」,查看該倉庫自己的最近 30 條提交,點一條看 patch。
  5. 在提交框裏寫信息或點「✦ 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。

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

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

小夜