如何在Mercurial中克隆存储库的子文件夹?

时间:2009-05-28 11:18:47

标签: mercurial clone dvcs

我有一个包含少数相关项目的Mercurial存储库。我想分支这些项目中的一个,以便在其他地方开展工作。

克隆只是存储库的一部分,这是实现这一目标的正确方法吗?

6 个答案:

答案 0 :(得分:53)

你想要的是narrow or partial clone,但遗憾的是还不支持。

如果您已经有一个大型存储库并且您意识到将它拆分为几个较小的存储库是有意义的,那么您可以使用convert extension执行 Mercurial到Mercurial转换 。请注意,这会创建一个存储库foo,而您无法在your-big-repofoo之间推/拉。

默认情况下未启用convert extension,因此请将以下内容添加到您的repo的hgrc文件或mercurial.ini文件中:

[extensions]
hgext.convert=

然后使用

创建一个map.txt文件
include "libs/foo"
rename "libs/foo" .

(请注意,即使在Windows上也可以使用正斜杠)并运行

$ hg convert --filemap map.txt your-big-repo foo

这将使foo成为一个存储库,其中包含来自libs/foo的{​​{1}}文件夹的完整历史记录。

如果您要从your-big-repo删除foo的所有证据,您可以使用your-big-repo进行另一次转换以删除目录。

如果您有多个这样的存储库并且想要将它们作为一个整体使用,那么您应该查看subrepositories。此功能允许您在结帐时包含其他存储库 - 类似于exclude libs/foo的工作方式。请按照该Wiki页面上的recommendations进行操作。

答案 1 :(得分:11)

您可以使用Convert Extension将您的仓库拆分为子仓库中的多个仓库,而不是进行部分克隆。

具体来说,请参阅Converting from Mercurial部分:

  

过滤Mercurial存储库以获取现有存储库的子集也很有用。例如,要将存储库foo的子目录subfoo转换为具有自己生命的存储库(同时保留其完整历史记录),请执行以下操作:

$ echo include subfoo > /tmp/myfilemap
$ echo rename subfoo . >> /tmp/myfilemap
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo

答案 2 :(得分:6)

我偶然发现了这个问题并发现了一种方法:使用符号链接(仅限Linux)

例如,如果您只需要存储库中的/project,则在您的计算机上克隆另一个文件夹中的存储库,然后使用ln -s /repo/location/ project。 Mercurial将处理它

答案 3 :(得分:3)

不可能,hg clone将克隆整个存储库。

您可以查看一个子存储库扩展,它允许您在存储库中拥有存储库,这可能符合您的需求。

答案 4 :(得分:2)

答案 5 :(得分:2)

(2016年末)Mainline Mercurial仍未打包支持“窄克隆”,但有第三方扩展以不同方式解决问题。

如果您只能处理一个狭窄的结帐(又名“稀疏结账”或“按文件路径部分结账”),那么来自hg-experimental repository的Facebook sparse.py分机(查看hgext3rd/目录内部)可能是可行的。在这种情况下,您仍然克隆完整历史记录(因此.hg目录不小)但您的工作目录仅显示/作用于完整存储库的子集。

或者谷歌已经创建了一个NarrowHG extension来缩小克隆(又名“按文件路径进行部分克隆”)。您将需要控制服务器,客户端并愿意使用实验性功能,但它确实将.hg中克隆的复制历史记录限制为原始存储库中的一部分。