這就是當你(1)指定-b feature/special
然後(2)使用update --remote
時你所要求的。 (兩者都是此操作所必需的,儘管它是觸發實際更新的update --remote
部分,您可以在update --remote
之前進入並添加,刪除或調整-b
設置 - 但通常您不會,並且我假設您沒有)
由於我沒有使用子模塊(對他們的替代名稱太熟悉了,「sob-modules」:-),儘管他們最近肯定有所改進)但我並不想給出「方式「來做到這一點。然而,我可以解釋這個潛在的機制,以及所有這些相當複雜的Jenga-ish結構是如何產生的。
從本質上講,一個子模塊只是一個簡單的配對:
換句話說,配對通過在上層項目提交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
的文件/樹)。
看來,-b導致分支HEAD @添加的時間存儲在分支的位置。後續更新--remote將較晚的HEAD分支導致差異。通過添加忽略=所有差異消失。我不希望我的用戶在該目錄中工作,因爲我使用它爲多個分支提供標準buildenv。所以我很喜歡這個 –
這不是一個正確的思考方式:它不是'-b'「存儲HEAD-at-time-of-add *代替* branch」,而是全部*子模塊*總是*記錄*僅*提交ID。同時'-b' *還*分別記錄「當您請求'--update'時自動更新到最新的意圖」。 (這是有道理的名稱'--update' ...)根據gitmodules(5),設置'submodule'。 .ignore = all'只是使更新*不顯示在你的差異*中,但你仍然會得到一個新的(更新的)子模塊,這看起來有點危險。 –
torek