2017-10-18 107 views
0

我想宣傳我公司內部monorepo的想法。
我打算使用他們這樣說:Git的子模塊軌道分支用途不同

我有一個「父」回購拿着我們的堆棧的每個部件一個子模塊,從而維護全球版本爲整個堆棧(我們可以簡單簽上給出的分支的每個組件)

這聽起來很完美的,因爲我們仍然可以任意CI服務開箱(益處,我們仍然推自主混帳回購協議,該子模塊)。

唯一的(可怕的)弱點這種做法,也就是如果做一個

git submodule update --remote 

採用以下配置:

[submodule "commonLib"] 
    path = commonLib 
    url = [email protected]:org/commonLib.git 
    branch = MY_BRANCH 

每個子模塊有效地在正確檢查,驅趕出局提交。

但是:他們都在分離的頭

爲什麼有沒有辦法有效地使用gitsumodule設有分公司。 即:更新時,有效檢出分支而不是此分支指向的提交? 是出於技術原因還是根本沒有在git中實現?

感謝答案

+0

我們遇到了同樣的問題。問題是,每次更新子模塊時,主存儲庫都需要更新子模塊,這將使主站更新主站分支。最後,我們將核心項目組合成單個回購,解決了問題。子模塊最適合第三方依賴項以及其他不經常更改的私有項目。理想情況下,每個子模塊應該獨立構建,因此它可以獨立運行在CI上。 你可能會看看谷歌git回購,部分解決這個問題。 https://gerrit.googlesource.com/git-repo/ –

+0

你能否詳細說明你正在談論的問題,我不確定以正確的方式理解它。 – Clement

+0

據我所知,如果你使用分支追蹤,checkouted子模塊將直接指向正確的提交,但不指向指向該提交的分支。這意味着每個人在工作之前都必須注意檢查正確的分支......而這又讓我感到困擾。 – Clement

回答

1

一部分是git的子模塊被設計爲允許一組多個資源庫中的一致/一致的看法。而要實現這一目標的唯一途徑是讓每個子模塊鎖定在一個特定的版本,與母公司回購跟蹤所有版本的所有子模塊,從而使整個項目monorepo的外觀。

當在這樣的項目環境中工作時,僅僅在分支級別指定某個子模塊沒有多大意義,因爲它可能會選擇與項目其餘部分不一致的版本。

答案的另一部分是不特定的git的子模塊,但任何混帳回購:拉一個特定的版本時,回購將在分離的頭的狀態。隨着因的Git分支不是很多的分支識別支持不具有相同的意義和重要性,在其他版本控制系統,詳見這個優秀的答案:https://stackoverflow.com/a/3162929/4495081

我看到更新的選擇分支,在右側時,減少人爲錯誤的風險的2點可能的方式:在您的所有信息庫和標籤/標籤

  • 使用一致的分支名稱(最好是由你的CI製作/ CD系統),其分支名稱以其標識符編碼。在開始時相當困難賣出,與每一個組件的球隊擁有完全的決策權的慾望,但它可以變得更好,如果/當球隊最終了解到他們實際需要對齊,使一個連貫的產品在一起。

  • 提供項目級自動化包裝來操作倉庫,這會從父倉庫提取適當的分支信息(同時執行健全性檢查和/或相關操作以維護開發人員的工作空間和項目一致性)。