2011-01-24 51 views
5

我有一個使用相當標準的源碼樹方法+ mercurial subrepositories的主項目。現在Mercurial子庫 - 管理更復雜的依賴關係層次結構

Master 
\lib - compiled binaries - things like log4net, AutoFac, etc 
\source - VS solution, one folder per project, etc 
\tools - stuff used during the build process 

\source\contrib - contains any subrepos like so: 

\source\contrib\Sub1 
\source\contrib\Sub2 

Master\.hgsub contains something like 
source\contrib\Sub1 = https://myserver.com/Sub1 

,最近確定了分公司2需要從Sub1的一些代碼,所以我必須要對此進行調節新的依賴結構。

問題當然是,如果我按照上面的方法,並添加Sub1作爲Sub2的subrepos,我結束了這種醜陋的情況。

\source\contrib\Sub2\source\contrib\Sub1 

現在主人有2個獨立副本Sub1!

所以我知道我應該在引用subrepos(=的RHS)時使用相對路徑 - 但這並不能幫助我理解這裏的場景。我不認爲有什麼辦法可以讓LHS生存之外的主存儲庫,我認爲是我真正需要在這裏。

我對如何解決這個問題有一些想法,但沒有一個與我合適,並且我認爲必須有更好的方法。我的理想解決方案允許我在多個項目中共享相同的子回購,而不用支付多份副本的處罰。這似乎只是低效浪費在我這裏的情況(加,我想有一個對Sub1的依賴所有項目都使用相同的汞修訂,而不是獨立revisioned)

  1. 刪除Sub1的作爲Master的subrepos,並更改主解決方案中的任何相對路徑以引用雙重嵌套的Sub1。這種路徑結構不僅可怕,而且如果將Sub3添加到對Sub1具有依賴性的主控中,我仍然有Sub1的兩個副本。

  2. 編譯Sub1的一個副本,並將其放在\ lib目錄中。 Sub1仍在經歷一些流失,我寧願針對源版本進行構建。我不想支付一直不斷拷貝新的二進制文件到源代碼樹的稅(並且膨脹樹)。

  3. 以某種方式打破Sub2對Sub1的依賴關係。基於存儲庫的體系結構,這可能不會發生。 Sub1包含一些非常通用的共享庫代碼。 Sub2包含兩個非常獨立的項目(客戶端SDK和服務器實現)所需的WCF服務契約/接口/類型。在這個時候,保持這些存儲庫是分開的是合理的。

也許我正在考慮這個錯誤...或者我不知道一些hg技巧。

任何幫助表示讚賞。

回答

2

我會說,忘記檢查二進制文件,這隻會導致資源庫膨脹。海事組織,任何建設輸出不應該存儲在源存儲庫。

如何教Sub2期望在../Sub1上找到Sub1?然後,如果您發現需要獨立於Sub1而使用Sub2,請創建一個「Sub2_standalone」回購,將Sub1和Sub2作爲子回購。

因此,在一切工作的時候,你會得到:

Master/ 
Master/source/contrib/Sub1 
Master/source/contrib/Sub2 

但當只是工作分公司2:

Sub2_standalone/ 
Sub2_standalone/Sub2 
Sub2_standalone/Sub1 
+0

嗯,這不是一個完全可怕的解決方案,我想,我想只要我送花兒給人有相關的代碼,就可以解決這個問題,在「兄弟」類型的設置。當然,我最終還會在Mercurial中加入一個額外的存儲庫,以便將兄弟姐妹放在一起,但這可能是我必須做出的折衷。感謝這個想法 - 我沒有考慮過。 – 2011-01-25 00:34:20

+0

雖然還沒有準備好將它標記爲答案 - 希望來自Selenic的某個人會用'最佳實踐'加以聲援; 0 – 2011-01-25 00:35:03

0

如果您需要嵌套的結構,你可以使用一個符號鏈接Sub1下方的Sub1,以確保Sub1的兩個版本始終處於相同的修訂版本。然後你實際上只有一個版本的Sub1,這似乎是你想要的。

在GNU/Linux它wouly是一個簡單的ln -s source/contrib/Sub1 source/contrib/Sub2/source/contrib/Sub1