簡體   English   中英

git子模塊“ --remote”導致(新提交)

[英]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式結構是如何產生的。

本質上,子模塊只是簡單的配對:

  • 我的超級項目X在存儲庫中。 它具有提交X1,X2,...,X11。
  • 要使用這些提交,您還需要一個單獨的存儲庫Y ...

    • 我使用提交Y20處的另一個存儲庫在提交X1,X2,X3等處測試了我的超級項目X,因此您必須而且將獲得提交Y20,並且僅會提交Y20。
    • 哦,等等,我剛剛在提交Y47的另一個存儲庫中使用新存儲庫在新提交X12上更新並重新測試了我的超級項目,因此您必須而且將獲得提交Y47,並且僅會提交Y47(對於我的提交X12;對於所有我以前的提交,則是Y20 )。

換句話說, 通過超級項目中的提交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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM