2010-12-16 86 views
18

我的項目是由代碼在以下位置mercurial subrepository是否必須是主存儲庫的子目錄?

C:\Dev\ProjectA 
C:\Lib\LibraryB 
C:\Lib\LibraryC 

目前每個文件夾的是一個完全獨立的Mercurial庫。項目A一直在變化,庫B和庫C很少發生變化。

我目前在發佈項目A的每一個版本時(當我記得)在庫B和C存儲庫中放置相應的標籤時,

我可以通過使用子庫來改進嗎?這需要我將庫B和C作爲項目A的子目錄嗎?

如果庫B和C必須是項目A的子目錄,如果我想啓動一個使用庫B的項目D,但根本不附屬於項目A,我該怎麼辦?

回答

18

如果庫B和C必須 子目錄A項目做什麼,如果我要開始一個項目d是 使用圖書館B I 做,但不以其他方式 與項目A在所有下屬?

任何項目都可以存在兩種獨立如在同一時間的另一項目的subrepository。我會通過建議工作流程來解釋。

首先,每個項目(A,B,C)中必須存在某處發表了祝福庫:

blessed repository

你可以在自己的服務器上運行hgwebdir,或使用的Mercurial託管服務,如BitbucketKiln。通過這種方式,開發人員擁有一箇中心授權點來提取/推送更改,並且您可以進行備份。

現在你可以讓這些存儲庫的克隆兩種不同的方式上工作:

  • 直接克隆項目。例如:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB 
    
  • 和/或通過把一個.hgsub文件中的ProjectA根與以下內容創建subrepository定義

    libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB 
    libraries/libraryC = http://bitbucket.org/LachlanG/LibraryC 
    

這些subrepository定義告訴水銀說每當項目A被克隆時,它也必須將庫B和庫C的克隆放入libraries文件夾中。

如果您在項目A中工作並提交,那麼您的更改將在libraries/LibraryBlibraries/LibraryC之間進行。 Mercurial將記錄項目A在.hgsubstate文件中正在使用哪個版本的庫。結果是,如果你在hg update的舊版本的項目上看到了上週的工作情況,那麼你也可以得到相應版本的庫。您甚至不需要製作標籤:-)

當您將hg push項目A更改爲有福的存儲庫時,Mercurial還會確保將子備份更改首先推送到其原始位置。這樣您就不會意外發布取決於未發佈的庫更改的項目更改。

如果您希望將所有內容保留在本地,則仍然可以通過使用相對路徑而不是子版本庫定義中的URL來使用此工作流程。

+0

您在末尾提到的庫文件夾在哪裏,「這些子庫定義告訴mercurial,無論projectA被克隆,它還必須將LibraryB和LibraryC的克隆放入庫文件夾中。」 – LachlanG 2010-12-16 11:44:51

+0

它只是一個文件夾,左邊的部分是:libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB是右邊的克隆應該是 – 2010-12-16 13:57:45

+0

@LachlanG:它會出現在ProjectA的根目錄克隆,例如'C:\ Dev \ ProjectA \ libraries \'。 – 2010-12-16 16:11:29

2

您確實可以聲明BC子項目A子目錄(它們將顯示爲子目錄,如Mercurial Subrepository中所述)。
這將提高你的釋放機制,因爲這將允許您:

  • 得到所有回購在一個地方(A及以下)
  • 參考BC下的每個A
  • 標籤標籤的準確子回購如果他們有任何修改
  • 標籤A與關於BC標籤在其中的信息(任何克隆A將能夠得到exa通過A使用)的BC克拉標籤

還可以聲明B作爲D一個subrepo,獨立的A。您在A(與B有關)中所做的將對D中使用的B沒有任何影響。

相關問題