19

假设我有一个源代码控制项目,其中包含很多子目录,其中许多我目前不需要。

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

这可能吗?如果可以,我该怎么做?

我仍在决定是选择 bazaar 还是 mercurial,因此有关其中任何一个的答案都会有所帮助。

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

4

6 回答 6

14

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

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

--depth <depth>

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

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

我不知道 Merurial 是否有这个功能。

于 2009-08-19T09:14:49.603 回答
10

如果您已经有一个存储库并且您想这样做,那将是一件痛苦的事情。

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

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

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

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

于 2009-08-19T16:52:58.743 回答
6

这个 wiki 页面来看,这个功能还没有在 Mercurial 中实现,但是有一个扩展可以通过“转换”存储库或其部分而不是实际的分支来大致完成您想要的事情。由于它可以从汞转换为汞,因此它可以用作部分克隆。这是你需要的吗?

于 2009-08-19T07:45:28.393 回答
4

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

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

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

于 2009-08-19T08:07:58.880 回答
4

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

于 2009-08-20T18:07:51.017 回答
3

对于 Bazaar,您有嵌套树:http ://bazaar-vcs.org/NestedTreesDesign ,它允许您将大项目拆分为子项目。
我还没有使用过这个功能,所以我不知道它的效果如何。

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

于 2009-08-19T09:45:07.560 回答