2016-04-20 90 views
2

如何防止git狀態顯示鎖定到特定子模塊分支的子模塊作爲更新後的更改?git submodule「--remote」結果(新提交)

我使用特定的分支添加一個git子模塊:

git submodule add -b feature/special [email protected]/buildenv.git env 
git commit -a -m "added submodule locked to special feature" 
git push 

一切都很好,直到有人致力於子模塊和推 現在,當我更新的子模塊I看到狀態新提交的消息

git submodule update --remote --recursive --init 
git diff 

index b45bfd8..2334b1f 160000 
--- a/env 
+++ b/env 
@@ -1 +1 @@ 
-Subproject commit b45bfd8f498a4d86a9586e1a4b1a6194052274b0 
+Subproject commit 2334b1faa019c28c6fe75cef94fd94d847593c37 

回答

0

這就是當你(1)指定-b feature/special然後(2)使用update --remote時你所要求的。 (兩者都是此操作所必需的,儘管它是觸發實際更新的update --remote部分,您可以在update --remote之前進入並添加,刪除或調整-b設置 - 但通常您不會,並且我假設您沒有)

由於我沒有使用子模塊(對他們的替代名稱太熟悉了,「sob-modules」:-),儘管他們最近肯定有所改進)但我並不想給出「方式「來做到這一點。然而,我可以解釋這個潛在的機制,以及所有這些相當複雜的Jenga-ish結構是如何產生的。

從本質上講,一個子模塊只是一個簡單的配對:

  • 我的上層項目X中的存儲庫。它提交了X1,X2,...,X11。
  • 要使用這些提交,你還需要一個獨立的存儲設備Y ...

    • 我測試了我的上層項目X在提交X1,X2,X3等,使用其他存儲庫在提交Y20,所以你必須和將會提交Y20並且只能提交Y20。
    • 哦,等等,我只是更新並重新測試我的超級項目在新的提交X12使用其他存儲庫在提交Y47,所以你必須並將獲得提交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,而新的子項目(我上面稱爲Y47)現在是2334b1faa019c28c6fe75cef94fd94d847593c37,這是您在git diff中看到的內容。

要將新的子項目ID添加到上層項目(這樣你可以現在,它的測試和已知的工作提交它),對git diff正顯示出你的gitlink,在這種情況下是env使用git add。當心在這裏,我用的話,被一個煩惱所有的時間咬傷:

$ git add env # now ready to commit 

避免git add env/因爲這最後的斜線增加了整個子模塊的內容到上層項目!)。有可能是附帶斜線的煩惱是固定的(git應該注意,不可能同時存在gitlink條目foo和名爲foo/anything的文件/樹)。

+0

看來,-b導致分支HEAD @添加的時間存儲在分支的位置。後續更新--remote將較晚的HEAD分支導致差異。通過添加忽略=所有差異消失。我不希望我的用戶在該目錄中工作,因爲我使用它爲多個分支提供標準buildenv。所以我很喜歡這個 –

+0

這不是一個正確的思考方式:它不是'-b'「存儲HEAD-at-time-of-add *代替* branch」,而是全部*子模塊*總是*記錄*僅*提交ID。同時'-b' *還*分別記錄「當您請求'--update'時自動更新到最新的意圖」。 (這是有道理的名稱'--update' ...)根據gitmodules(5),設置'submodule'。 .ignore = all'只是使更新*不顯示在你的差異*中,但你仍然會得到一個新的(更新的)子模塊,這看起來有點危險。 – torek

0

使用-b抓取子模塊中的HEAD commit id並將其存儲在客戶端分支中。隨後對子模塊的提交導致新的HEAD。將子模塊更新到新分支HEAD後,我們看到存儲的原始頭和新頭之間存在差異。

將ignore = all添加到.gitmodules會隱藏此分支用戶,但可能並不適合所有情況。