我有一個帶有幾個子模塊的 git 存盤庫(參見示例)。它的結構如下所示:
I--A--B <- main
\
C <- branch-c
- 提交 A 添加一個
submodule-a - 提交 B 添加一個
submodule-b - 提交 C 添加一個
submodule-con 分支branch-c
當我克隆上面的 repo 時,
git clone --recurse-submodules <URL>只使用submodule-a和submodule-b子模塊被初始化和克隆。
然后,當我想使用 簽出分支branch-c時git checkout branch-c,submodule-c會創建目錄,但子模塊本身并未初始化。命令輸出中沒有指示需要一些額外的步驟。既不git status也不git diff給出任何提示。
相反,當我想檢查時,branch-c我git checkout --recurse-submodules branch-c得到一個錯誤:
fatal: not a git repository: ../../.git/modules/subrepos/subrepo-c
fatal: could not reset submodule index
如何branch-c在自動初始化所??有子模塊的同時簽出(或切換到)分支?
uj5u.com熱心網友回復:
您的示例存盤庫缺少branch-c,因此它不是一個完整的 MCVE,但它是一個好的開始 :)
當我克隆上面的 repo 時,
git clone --recurse-submodules <URL>只使用submodule-a和submodule-b子模塊被初始化和克隆。
是的,這是當前的行為git clone --recurse-submodules。git submodule update --init --recursive子模塊在 的檢出階段git clone使用 的呼叫進行克隆和初始化,因此,只有記錄在默認分支(或使用 指定的分支git clone -b <branch>)中的子模塊被克隆和初始化。
然后,當我想使用 簽出分支
branch-c時git checkout branch-c,submodule-c會創建目錄,但子模塊本身并未初始化。命令輸出中沒有指示需要一些額外的步驟。既不git status也不git diff給出任何提示。
是的,不幸的是,這仍然是 Git 的默認行為。默認情況下,不簽出子模塊作業樹git checkout <branch>。git submodule status(或只是git submodule)將顯示帶有-前綴的未初始化子模塊。
相反,當我想檢查時,
branch-c我git checkout --recurse-submodules branch-c得到一個錯誤:fatal: not a git repository: ../../.git/modules/subrepos/subrepo-c fatal: could not reset submodule index
這是一個很好的反射,但不幸的是它在特定情況下不起作用并導致這種糟糕的用戶體驗。git checkout --recurse-submodules <branch>假設記錄的每個子模塊branch-c都已經初始化。由于這里不是這種情況,因此它會出錯,因為它找不到.git子模塊的目錄。資訊可能更清楚。您要做的(branch-c克隆存盤庫后第一次切換到)是非遞回地簽出branch-c,然后初始化子模塊:
git checkout branch-c
git submodule update --init --recursive
然后,您將能夠正確地在您的分支之間切換--recurse-submodules:
git checkout --recurse-submodules main
git checkout --recurse-submodules branch-c
# etc
請注意,您可以submodule.recurse在配置中進行設定以避免一直使用--recurse-submodules。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/477767.html
