2013-03-26 19 views
-1

我需要一些幫助爲我的代碼庫設計SCM。代碼庫相當複雜,首先我會試着描述它。用於大型模塊化代碼庫的SCM

代碼庫由許多不同產品的代碼組成,爲了簡單起見,我們假設爲Product1Product2(實際上有更多)。每個Product都有多個與其關聯的軟件Projects,例如Core Application和支持軟件,如iOSAndroid應用程序(這因產品而異)。每個Project將需要使用共同的代碼Product(即Core,iOSAndroid應用程序都需要共享一些通用代碼)。此外,Products需要彼此共享內部的庫房。

實際上,你最終得到這樣的結構:

Library1 
Library2 
Product1 
├── Common 
├── Core Application 
├── iOS 
└── Android 
Product2 
├── Common 
├── Core Application 
├── iOS 
└── Android 

以下功能是絕對必需的:

  1. 能夠檢查出最小碼爲一個項目設置 - 例如,如果我想構建Product1'sAndroid應用程序,我只想查看Library1Library2Product1/Common,Product1/Android。代碼庫非常龐大檢查一切將需要大量時間
  2. 將共享庫,通用代碼和項目代碼的狀態恢復爲特定版本 - 例如,我需要構建Product2'sCore Application,因爲它是2個月前測試中的錯誤,我需要Library1Library2Product2/CommonProduct2/Core Application全部恢復到同一版本
  3. 將文件移動到不同的共享文件夾,同時維持歷史 - 這是不可能把全部Product的正確的代碼進入Common文件夾在開始。請求隨時間變化的需求和新產品,這意味着曾經住在Product2/Core Application中的代碼需要移動到Product2/Common或甚至Library2

目前,我們正在使用的系統是一個巨大的SVN倉庫,包含所有ProductsProjectsLibraries。在SVN中可以選擇性的代碼簽出,所以我們可以選擇只簽出特定的文件夾。因爲它全是一個版本庫,所以一切都很好地恢復到同一版本。當我們分支或標記時,我們分支/標記整個存儲庫!

我想正確模塊化代碼庫,例如,Library1住在它自己的存儲庫中,並且簡單地包含在其他存儲庫中。這是不是與svn::externals真的有可能,因爲它打破要求2

我想用某種形式的DVCS的,爲以下原因:

  1. 性能 - 提交時SVN是緩慢的大變更
  2. Braching/Merging - 嘗試合併大型SVN分支是一場噩夢,我們不惜一切代價避免它。我知道使用DVCS更容易。
  3. 正確支持模塊。我知道Git有子模塊,Mercurial有subrepos,這看起來符合我的設計目標,但似乎在更改修訂版時必須手動更新subrepos。我希望在1個簡單的步驟中完成。
  4. 更清晰的存儲庫結構。使用subrepos,每個項目將是自己的reposisotry,具有清晰的結構和明確的依賴

任何想法?

回答

1

最近Mercurial已經做了一些改變,旨在使subrepos更容易和更有效地使用。我一直沒有密切關注他們 - 你可能想看看最近的hg-crew提交歷史,看看有沒有什麼可能影響你的決定。

我已經廣泛地使用了Git和Mercurial,但是對Mercurial有更深入的瞭解,並且更喜歡使用它。我已經將項目從ClearCase,SVN和Git遷移到Mercurial,並且在所有情況下,遷移都非常順利 - 重要的事情是讓幾個人爲您的團隊設置工作流程並設置具有代表性的測試回收站先嚐試一下。

hg convert extension可以將來自不同來源的存儲庫轉換爲Mercurial存儲庫,並且可以使用filemap轉換部分回購,重命名文件/目錄等。我確定Git上有類似的東西,但我已經從不需要使用它。