[英]git submodule “--remote” results in (new commits)
如何防止git status在更新后顯示更改為鎖定到特定子模塊分支的子模塊?
我使用特定分支添加了git子模塊:
git submodule add -b feature/special git@.../buildenv.git env
git commit -a -m "added submodule locked to special feature"
git push
一切都很好,直到有人提交了子模塊並按下了按鈕。現在,當我更新子模塊時,我看到了來自狀態的新提交消息
git submodule update --remote --recursive --init
git diff
index b45bfd8..2334b1f 160000
--- a/env
+++ b/env
@@ -1 +1 @@
-Subproject commit b45bfd8f498a4d86a9586e1a4b1a6194052274b0
+Subproject commit 2334b1faa019c28c6fe75cef94fd94d847593c37
這就是您(1)指定-b feature/special
,然后(2)使用update --remote
。 (此操作都是必需的,盡管觸發實際更新的是update --remote
部分,並且您可以在update --remote
之前進入並添加,刪除或調整-b
設置-但通常您不會,而我認為您沒有。)
因為我不使用子模塊(對它們的替代名稱“ sob-modules”非常熟悉::-),盡管它們最近確實有所改進),所以我真的不想為“正確的方法”提供建議。 但是,我可以解釋其基本機制以及所有這些相當復雜的Jenga式結構是如何產生的。
本質上,子模塊只是簡單的配對:
要使用這些提交,您還需要一個單獨的存儲庫Y ...
換句話說, 通過超級項目中的提交ID進行配對:對於超級項目中的每個提交,您都將列出子項目中(單個)提交的SHA-1 ID。
這對於完全靜態的子項目是很好的,但是最終,我們使用實際上具有並使用分支的子項目來構建事物,而不是永遠堅持使用2.0版(提交Y20)。 因此,自從我上次使用它以來,git現在可以將分支名稱與子項目關聯。
但是,您必須仍然明確地告訴git, 現在該更新子項目了:“請進入我的子項目,在分支feature/special
項目上找到最新的提交,並將其SHA-1 ID記錄在我的超級項目中。” 這就是用-b
設置子模塊時git submodule update --remote
功能(帶有幾個額外的模式選項)。
在這一點上,您的工作是測試整個事情並確保所有事情都起作用。 如果它所有的工作,你就可以使你的上層項目新的承諾。 這個新的提交將記錄您在git diff
輸出中看到的新ID。 舊的子項目ID(在上面我稱為Y20)是b45bfd8f498a4d86a9586e1a4b1a6194052274b0
,而新的子項目ID(在上面我稱為Y47)現在是2334b1faa019c28c6fe75cef94fd94d847593c37
,這就是您在git diff
看到的內容。
要將新的子項目ID添加到超級項目中(以便您可以在經過測試並可以正常工作的情況下提交它),請在git diff
向您顯示的gitlink上使用git add
,在本例中為env
。 在這里當心,我以前一直被煩惱所困擾:
$ git add env # now ready to commit
( 避免 git add env/
的尾部斜杠, 因為這會將整個子模塊的內容添加到超級項目中! )。 這可能是與結尾的斜線的煩惱是固定的(GIT中應該注意到它不可能同時擁有gitlink進入foo
和文件名為/棵foo/ anything
)。
使用-b會從子模塊中獲取HEAD提交ID,並將其存儲在client分支中。 對子模塊的后續提交將導致新的HEAD。 將子模塊更新到新分支HEAD后,我們看到存儲的原始頭和新頭之間的差異。
在.gitmodules中添加ignore = all將對分支用戶隱藏此內容,但可能並非在所有情況下都適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.