2009-08-19 51 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,它可以让你抽取一个“虚拟”仓库只是一个特定的子项目,然后使子项目的变化,然后这些更改合并回。