Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Git 提示子模組路徑沒有 URL?先核對 gitlink 與 .gitmodules,再刪檔

分別檢查失敗提交、目前索引、版本化映射與本機檢出,再選擇修復、同步、deinit 或從儲存庫移除。

原創示意圖:比較選定提交的 gitlink、映射與目前索引、本機檢出;磁碟存在檔案不等於修復已提交快照。
原創示意圖:比較選定提交的 gitlink、映射與目前索引、本機檢出;磁碟存在檔案不等於修復已提交快照。 Watch at Ease

「No url found for submodule path」首先要求核查路徑到 URL 的映射,不應直接刪除 Git 中繼資料。記錄子模組提交的 gitlink 與 .gitmodules 中的設定是兩份狀態;目前索引、磁碟工作檔案和真正失敗的提交可能不一致。

先保留錯誤原文、主儲存庫失敗提交、路徑和本機工作,再確認已提交的 gitlink 與映射、檢查本機設定,最後依儲存庫真正的意圖處理。下文的 Git 2.51.1 隔離實驗說明:磁碟檔案正確,不代表失敗提交已修好。

分別確認失敗提交與目前索引

保存完整錯誤,核實失敗檢出或 CI 實際使用的主儲存庫提交。在主儲存庫根目錄操作,寫入前先保留未提交工作。以 git ls-files --stage -- path/to/item 查看目前索引;模式 160000 表明它是 gitlink,並給出物件 ID。僅看到巢狀 .git 目錄,不能據此認定子模組。

再執行 git ls-tree --full-tree COMMIT -- path/to/item,把 COMMIT 換成已核實的失敗提交 ID。它讀取指定提交樹,不是假設目前索引仍與其一致。若那裡沒有 gitlink,先調查是否是另一份檢出、巢狀主儲存庫、暫存變更或錯誤路徑,再決定是否修復映射。

從同一提交讀取映射

用 git show COMMIT:.gitmodules 查看失敗提交中的版本化檔案。檔案不存在本身就是證據,不能悄悄拿另一分支的檔案代替。尋找 path 與 gitlink 精確相符的區段,包括大小寫。Git 要求路徑唯一、相對根目錄且沒有結尾斜線,並具有 URL;區段名稱不必等於路徑。

檢查目前工作樹檔案可用相容寫法 git config -f .gitmodules --get-regexp '^submodule\..*\.(path|url)$'。正規表示式必須加引號,避免 shell 把 | 當管線。將結果與提交中的檔案比較;只在磁碟恢復未提交的檔案,不會改變乾淨檢出失敗提交時取得的內容。

單獨檢查本機設定,只同步預期 URL

用 git config --local --get-regexp '^submodule\..*\.(url|active)$' 單獨查看已初始化的本機設定。鍵對應子模組名稱,需要與 .gitmodules 中的 path 關聯。初始化可從版本化範本填入本機設定,其後的本機覆寫值可能不同。已 deinit 的子模組仍可能有儲存庫定義,卻沒有檢出檔案。

儲存庫有意更改既有 URL 時,先核實核准的遠端位址,修正或更新 .gitmodules,再對目標已初始化子模組執行 git submodule sync --recursive -- path/to/item,更新前檢查生效 URL。sync 只同步已登記的 URL 設定,不能補缺少的映射、改變記錄的子提交或解決私有遠端授權。

區分保留、本機移除與儲存庫移除

要保留子模組,就恢復精確路徑與核准 URL,暫存映射、檢查差異,再建立預期的修復提交。接著初始化或更新,並對此修復提交做乾淨檢出驗證。若只想更改 URL,應保留 gitlink,除非確實也要更新子提交,同時同步受影響的已初始化檢出。

只想去掉本機檢出時,先保護本機工作,再用 git submodule deinit -- path/to/item;不要加 --force 丟棄修改。若要從版本控制移除,用 git rm -- path/to/item,並在提交前審查 gitlink 刪除和 .gitmodules 區段變更。兩者目標不同;git rm --cached 只操作索引,不會像一般 git rm 自動清理映射區段。

先以乾淨複製驗證,再懷疑快取

在隔離的 Git 2.51.1 實驗儲存庫中,我們提交了缺少映射的 gitlink,新的本機複製重現相同 fatal 錯誤。索引與提交樹都顯示 160000。只把 .gitmodules 放回磁碟後,工作檔案檢查成功,但讀取失敗提交的 git show 仍失敗。提交恢復的映射後,乾淨本機複製初始化成功;其後 deinit 清除了本機檢出狀態,而已提交 gitlink 與映射保持不變。

實驗只用本機子儲存庫,僅對各條實驗命令放行 file 傳輸,沒有重現你的 CI、網路或私有授權;該放行不是正式環境修復方案。只有已提交中繼資料正確後,才調查可丟棄檢出是否過時。先保留紀錄與工作,適當時只重建可丟棄檢出,並記錄失敗與修復提交及乾淨複製結果。不要從刪除 .git/modules、巢狀 .git 資料或開發者工作目錄開始。

原創示意圖:保留子模組、更改 URL、本機 deinit 與儲存庫移除會改變不同狀態;先保護工作,再驗證修復提交的乾淨檢出。
原創示意圖:保留子模組、更改 URL、本機 deinit 與儲存庫移除會改變不同狀態;先保護工作,再驗證修復提交的乾淨檢出。 Watch at Ease