2009-08-19 101 views
19

假設我在源代碼管理中有很多子目錄的項目,其中很多目前我都不需要。可以用bazaar,mercurial或git做一個部分克隆/分支嗎?

我想創建一個僅包含整個樹的一部分的工作副本,它仍然保留進行更改,提交它們並將其推回的能力。

這是可能的,如果是這樣,我該怎麼做?

我還在決定是否要去集市或mercurial,所以對這兩個問題的答案都會有所幫助。

編輯:其實,git的解決方案也是有用的。

回答

10

如果你已經有一個倉庫,你想做到這一點,這將是一個痛苦。

如果你要以全新的存儲庫來這樣做,你可能想看看Mercurial的新subrepos

基本上你對某些目錄創建獨立的庫:

myproject/ 
    .hg/ 
    source code/ 
     ... files here ... 
    documentation/ (subrepo) 
     .hg/ 
     ... files here ... 
    graphics/ (subrepo) 
     .hg/ 
     ... files here ... 

地隔離不同部分在不同的存儲庫項目。 「包含」回購(在這種情況下是myproject)會跟蹤每次提交時subrepos的修訂版本。我提到的subrepo wiki頁面很好地解釋了它。

6

this wiki page來看,這個特性還沒有在Mercurial中實現,然而有一個extension可以通過'轉換'一個倉庫或者它的一部分而不是實際的分支來達到你想要的。由於它可以轉化爲Hg,因此它可以作爲部分克隆。這是你需要的嗎?

+2

這是一個有用的答案,但請注意一些重要的注意事項:'hg convert'可以讓您只獲取存儲庫一部分的克隆yes,但這些更改集不會具有與原始更改集相同的SHA-1 ID。你不能推回原來的庫(至少不是安全的),您也可以嘗試手動管理移栽回你做(例如,用'汞transplant')的變化。這對於長期克隆來說並不理想。 – quark 2009-08-21 00:21:41

4

在大多數DCVS中,規則是「1 project == 1 repository」。沒有「子項目」的概念(與在Subversion中檢索子樹並在其上工作的Subversion不同)。

主要原因是您的「項目」包含根文件夾中整個存儲庫的副本。如果您可以在子文件夾中創建整個存儲庫的副本,事情會變得非常複雜。

另一方面,創建工作副本是一個快速操作(除非底層文件系統很慢)。

14

據我所知,克隆樹的一個子集是不可能的,但是還有其他的可能性。

混帳:命令git clone--depth標誌:

--depth <depth>

創建一個淺克隆與歷史截斷爲修訂的指定數量。一個淺層存儲庫有一些限制(你不能從中克隆或取出,也不能從中推入或推入),但如果你只關心一個歷史悠久的大型項目的最近歷史,並且想要發送修補程序作爲補丁。

巴扎:爲checkout命令標誌--lightweight只下載一個工作目錄,而不是全部歷史和節省帶寬和磁盤空間。所有操作仍受支持,但需要網絡連接才能執行操作。

我不知道Merurial是否具有此功能。

3

對於Bazaar,您嵌套樹木:http://bazaar-vcs.org/NestedTreesDesign它允許您在子項目中拆分大型項目。
我還沒有使用這個功能,所以我不知道它的工作效果如何。

你也可以使用--hardlink分支來避免複製一堆文件(不知道它是否適用於Windows ...),沒有歷史的分支(較輕的分支)或沒有工作樹的分支(沒有文件,只有歷史)。

+3

在其他DVCS中也支持它:它是Git **中的git-submodule,並且我認爲** Mercurial **中的森林擴展。但是,我認爲,它與原始海報的問題只有切線相關,因爲它需要額外的設置*前期*。 – 2009-08-19 10:13:23

+0

這些在我鏈接到的頁面中提到。 我剛剛嘗試過:在現有測試樹上使用拆分,提交更改,然後分支子樹,它工作。沒有必要這樣做,至少對於bzr來說。 – PhiLho 2009-08-19 15:12:48

+2

@Jakub:你不需要Forest擴展任何mroe - SubRepos在1.3中被添加到Mercurial核心。 – 2009-08-19 16:53:41

5

在Git中,你可以使用git subtree,它可以讓你抽取一個「虛擬」倉庫只是一個特定的子項目,然後使子項目的變化,然後這些更改合併回。