前言¶
用 DeepSeek Harness(dsh)跑編碼智能體時,會話裏的 git commit 多半是 bash 工具代勞的。作者字段看起來只是 user.name / user.email,實際很容易被改掉:某一輪對話裏寫了 -c user.name="DSH Agent",或者把倉庫、全局配置改成佔位身份,後面的提交就會一直掛在錯誤作者名下。GitHub 貢獻圖對不上、代碼評審對不上人,排查時還得回頭翻 reflog。
DeepSeek Harness 的設計原則是「一切皆插件」:模型、工具、會話、沙箱和界面都可以在配置層替換,不必改框架源碼。官方倉庫在 deepseek-ai/deepseek-harness,目前仍是 developer preview。社區目錄 deepseek-harness-plugin.com 是獨立收錄站,和 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。
dsh-git-identity 做的事很窄:在插件加載時解析出「這臺環境自己的」git 身份,寫入 GIT_AUTHOR_* / GIT_COMMITTER_*,壓過後續一切 git config。本文按目錄詳情頁、GitHub README / package.json / index.mjs / cordis.patch.yml,以及官方 Harness 倉庫交叉覈對後整理。
這是什麼¶
dsh-git-identity 是面向 DeepSeek Harness 的開發與運行時插件,由 LoserFox 維護,倉庫爲 LoserFox/dsh-git-identity。目錄頁與 GitHub 倉庫簡介一致:git 提交固定使用環境自身作者身份,優先 gh CLI 登錄賬號和 GitHub noreply 郵箱,再用環境變量壓過一切 git config。
倉庫 package.json 裏的 npm 包名是 @loserfox/git-identity,當前版本 0.1.0。它聲明瞭 dsh.bundle.patch,指向 cordis.patch.yml,因此按官方文檔屬於 profile bundle(README 寫明面向 0812 及之後的官方插件系統):裝進某個 profile 後,組合層會插入一行 id: git-identity。GitHub 主題標了 dsh-plugin。2026-08-18 查詢目錄頁與 GitHub API,星標均爲 7。倉庫根目錄沒有 LICENSE 文件,GitHub API 的 license 字段爲空,許可證目前未在倉庫中聲明。
它解決的不是「幫智能體寫更好的 commit message」,而是:DSH 進程內任意路徑發起的 git 提交,作者和提交者都落到同一套已解析身份上。
核心功能¶
用環境變量壓過 git config¶
Git 解析作者身份時,GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME、GIT_COMMITTER_EMAIL 的優先級高於 -c user.name=...、倉庫本地配置和 git config --global。插件在 apply() 裏把解析結果寫進當前進程的這四個環境變量。
README 和源碼都說明:DSH 的 subprocess 層在啓動每個 bash 子進程時會帶上 process.env(會剔除憑據)。因此會話裏走 bash 工具的 git commit,會繼承這組變量。源碼註釋寫明,即便某次會話顯式傳了 -c user.name=...,環境變量仍然更高,repo-local / global 配置也蓋不過去。
身份解析有固定順序¶
每個來源必須同時給出 name 與 email,缺一不可。優先級從高到低:
- 插件配置
{ name, email }:顯式釘死,未登錄 gh 時也可以用。 - gh CLI 登錄賬號:調用
gh api user,name 取login,email 拼成{id}+{login}@users.noreply.github.com。 - 啓動 DSH 時已有的
GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL。插件會忽略自己上一次注入的值,避免 HMR 重載時把自身輸出當成外部輸入。 git config --global user.name/user.email兜底。
全部解析不到時只打告警、不注入,源碼和 README 都寫了「絕不憑空編造身份」。gh api user 設了 8 秒超時,gh 未安裝、未登錄或網絡異常時快速失敗,不拖慢 DSH 啓動。
冪等寫回 global 配置¶
進程內注入只覆蓋 DSH 子進程。插件還會把同一套身份同步回 git config --global:僅當 global 的 user.name / user.email 缺失,或與解析結果不一致時才寫。這樣插件進程外的普通終端提交也能對齊。寫不進去只告警,不影響已經注入的環境變量。
加載時機是 DSH 每次啓動,以及每次 HMR 重載。實現是純 ESM,index.mjs 零依賴,README 寫明改入口文件無需構建。
安裝與啓用¶
目錄頁給出的安裝命令以原文爲準,在 DeepSeek Harness 終端運行:
dsh plugin add github:LoserFox/dsh-git-identity
如需可復現安裝,目錄頁建議固定 commit 哈希:
dsh plugin add github:LoserFox/dsh-git-identity#commit
把 commit 換成倉庫裏實際的提交 SHA。官方文檔也用 github:owner/repo 這種 git 源安裝 bundle;pnpm 拉到的是源碼而不是構建產物。本插件沒有構建步驟,但安裝時仍可能執行倉庫代碼。目錄頁寫明:插件以當前 dsh 進程的權限運行,安裝前應檢查源代碼倉庫和許可證。
README 補充了按 profile 安裝的寫法,適合 web / headless 等不同啓動組合:
dsh plugin --profile web add /path/to/dsh-git-identity
dsh plugin --profile headless add /path/to/dsh-git-identity
本地 checkout 路徑按本機實際情況替換。安裝後需要重啓目標 profile 的 DSH 進程:README 寫明組合層變更不參與 HMR 熱更新。驗證組合層是否掛上:
dsh --profile web --dump-config | grep git-identity
cordis.patch.yml 插入的行是 id: git-identity、name: '@loserfox/git-identity'。能在 dump 結果裏看到這一層,說明 bundle 已經進 profile。
典型用法¶
默認不配 name / email 時,只要本機 gh 已登錄,插件會在啓動日誌裏打出類似:
[git-identity] git 提交身份固定爲 <login> <<id>+<login>@users.noreply.github.com>(來源:gh CLI 登錄賬號)
之後 DSH 會話裏的 git commit 會帶上這組作者。不想依賴 gh、或要釘死公司郵箱時,按 README 在 bundle 的 patch 裏給這一行加 config:
- insert:
- id: git-identity
name: '@loserfox/git-identity'
config:
name: LoserFox
email: 57448027+LoserFox@users.noreply.github.com
上面的 email 是 README 裏的示例,對應用戶 LoserFox 的 GitHub noreply 地址。換成自己的 name / email 即可。官方文檔提醒:後應用的層會整行替換 config,用戶側覆蓋應寫在 profile 自己的 cordis.patch.yml,不要改包內文件。
解析失敗時,日誌是:
[git-identity] 無法解析環境自身的 git 身份(需 gh 登錄、GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL 或 git config --global user.name/user.email),跳過注入
這時提交仍走原來的 git 配置,插件不會填一個假作者。
適用場景與注意事項¶
適合這些情況:
- 智能體經常代爲
git commit/git commit --amend,不希望作者變成DSH Agent或某次會話改過的佔位名。 - 同一臺機器上 DSH 內提交和普通終端提交要對齊,可以接受插件在必要時寫回
git config --global。 - 提交需要落到 GitHub 賬號上,希望 email 使用
id+login@users.noreply.github.com這種 noreply 地址。
使用前要清楚幾條邊界:
- 插件以當前 dsh 進程權限運行,安裝和加載時會執行
index.mjs。它會調用gh api user,並可能改本機git config --global。多用戶共用同一套 global 配置、或不希望工具改全局身份時,不要裝,或先在插件配置裏釘死、再評估寫回行爲。 - 倉庫未聲明許可證。目錄頁稱社區開源、可查看源碼並免費安裝,但合規場景應自行確認許可條款後再用。
- 身份來源必須成對出現。只配了
name或只配了email,不會採用這條插件配置,會繼續往下找 gh / 環境變量 / global。 - 解析 gh 身份時,顯示名用的是 GitHub
login,不是 profile 裏的 Name 字段。 - 社區目錄不是 DeepSeek 官方應用商店。安裝命令以目錄頁爲準;固定 commit、先讀源碼,比直接追最新
main更穩。
小結¶
dsh-git-identity 把「DSH 裏的 git 提交該用誰的名字」收成啓動時的一次解析:配置、gh CLI、啓動環境變量、全局 git 配置按順序嘗試,寫成環境變量,必要時再寫回 global。它不增加新的 git 工具,也不改 commit 內容,只保證作者字段不再被會話裏的臨時 -c 或改配置帶跑偏。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-git-identity/
GitHub:https://github.com/LoserFox/dsh-git-identity