在 DSH 工作流中,git 相關插件(如 @linxin666/dsh-client-ui-git-graph)的分支膠囊依賴工作區目錄是一個 git 倉庫。如果目錄未初始化 git,相關功能將不可用。dsh-auto-git 解決了這個問題,它監聽工作區註冊事件並自動爲每個新工作區執行 git init,使 git 功能在所有工作區中可用。
核心功能¶
- 自動初始化:監聽
domain/changed事件,對新工作區根目錄執行git init -b main。 - 初始提交:默認情況下,執行一個空提交 (
git commit --allow-empty),確保 HEAD 不處於 detached 狀態,分支膠囊能正常顯示分支名。 - 冪等處理:在同一個 host 進程內,同一個路徑只處理一次;如果倉庫已存在則跳過。
- 零運行時依賴:僅使用 Node.js 原生模塊 (
node:child_process/node:fs/promises),無額外依賴。 - 無嵌套:如果父目錄已經是倉庫或當前目錄是 git worktree 檢出,則跳過初始化。
安裝與啓用¶
從 GitHub 安裝:
dsh plugin --profile web add github:zhitiaojun/dsh-auto-git
本地開發用 link: 指向 checkout:
dsh plugin --profile web add link:D:/Project/1/dsh-auto-git
重要:安裝後必須重啓 dsh web 纔會裝進 host 進程。
配置¶
安裝後由 profile 的 bundle patch (cordis.patch.yml) 提供行配置。以下是可用字段:
| 字段 | 默認值 | 含義 |
|---|---|---|
enabled |
true |
總開關,false 時插件什麼都不裝 |
branch |
main |
初始分支名 |
initialCommit |
true |
是否補一個空提交(關閉則新倉庫分支名可能顯示爲 detached) |
sweepExisting |
true |
是否也處理啓動前已註冊的工作區(默認會處理當前所有未註冊爲倉庫的已註冊工作區) |
timeoutMs |
30000 |
每條 git 命令的超時時間 |
驗證¶
- 運行核心測試:
在倉庫根目錄下執行:
node D:\Project\1\dsh-auto-git\test\smoke.mjs
- 檢查日誌:
查看安裝日誌:
~\.dsh\profiles\web\.dsh-market\log.ndjson
應有該包的 `install` 與隨後的 `restart` 記錄。
- 檢查 Git 狀態:
在任意新註冊的 DSH 工作區目錄中執行:
git -C <新目錄> log --oneline
應該能看到 `chore: initial commit`。
注意事項¶
- sweepExisting 行爲:默認爲
true。安裝並重啓後,當前所有還不是倉庫的已註冊工作區都會被初始化。如果只想影響以後新建的工作區,需將sweepExisting改爲false。 - 卸載回滾:卸載插件不會回滾已經建好的倉庫。
- 依賴版本:需要 DSH 版本
>=0.1.5-rc.1。 - 運行環境:純 host 側插件,無瀏覽器貢獻代碼。
總結¶
dsh-auto-git 通過在 DSH 工作區註冊時自動初始化 git 倉庫,解決了 git 相關插件在非倉庫目錄下不可用的問題。它是一個輕量級的 host 側插件,適合需要統一 git 管理的 DSH 工作流環境。