是否可以使用bazaar,mercurial或git进行部分克隆/分支?

问题描述 投票:19回答:6

假设我在源代码管理中有一个带有很多子目录的项目,其中很多是我目前不需要的。

我想创建一个只包含整个树的一部分的工作副本,它仍然保持更改,提交和推送它们的能力。

这是可能的,如果是这样,我该怎么办?

我还在决定是否选择集市或mercurial,所以关于其中任何一个的答案都会有所帮助。

编辑:实际上,git的解决方案也很有用。

git version-control mercurial bazaar
6个回答
10
投票

如果你已经有了一个存储库并且你想要这样做,那将是一个痛苦。

如果您要使用全新的存储库执行此操作,您可能需要查看Mercurial的新subrepos

基本上,您为某些目录创建独立存储库:

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

这将项目的不同部分隔离在不同的存储库中。 “包含”repo(本例中为myproject)跟踪每次提交时子实例的修订版本。我提到的subrepo wiki页面解释得很好。


14
投票

据我所知,克隆树的子集是不可能的,但还有其他可能性。

Git:命令git clone有一个--depth标志:

--depth <depth>

创建一个浅层克隆,其历史记录被截断为指定的修订数。浅存储库有许多限制(您不能克隆或获取它,也不能从中推送或插入它),但如果您只对历史悠久的大型项目的近期历史感兴趣并且希望将修补程序作为补丁发送。

Bazaar:--lightweight命令的标志checkout只下载工作目录而不是整个历史记录,并节省带宽和磁盘空间。仍支持所有操作,但需要网络连接才能执行这些操作。

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


6
投票

this wiki page来看,这个功能尚未在Mercurial中实现,但是有一个extension可以通过“转换”存储库或其部分,而不是实际的分支来做大约你想要的。由于它可以从Hg转换为Hg,因此它可以作为部分克隆。这是你需要的吗?


4
投票

在大多数DCVS中,规则是“1个项目== 1个存储库”。没有“子项目”的概念(与Subversion不同,您可以在其中查看子树并进行处理)。

主要原因是您的“项目”包含根文件夹中整个存储库的副本。如果您可以在子文件夹中创建整个存储库的副本,那么事情会变得非常复杂。

从好的方面来说,创建工作副本是一种快速操作(除非底层文件系统很慢)。


4
投票

在git中,您可以使用git subtree,它允许您仅为特定子项目提取“虚拟”存储库,然后在子项目中进行更改,然后将这些更改合并回来。


3
投票

对于Bazaar,您有嵌套树:http://bazaar-vcs.org/NestedTreesDesign,它允许您在子项目中拆分大项目。 我还没有使用过这个功能,所以我不知道它有多好用。

您还可以使用--hardlink进行分支以避免复制一堆文件(不确定它是否适用于Windows ...),没有历史记录的分支(较轻的分支)或没有工作树的分支(没有文件,只有历史记录)。

© www.soinside.com 2019 - 2024. All rights reserved.