62

我有一个 Mercurial 存储库,其中包含一些相关项目。我只想将这些项目中的一个分支到其他地方。

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

4

6 回答 6

53

你想要的是一个的或部分的克隆,但不幸的是这还不被支持。

如果您已经有一个大存储库并且您意识到将其拆分为几个较小的存储库是有意义的,那么您可以使用convert 扩展来执行Mercurial 到 Mercurial 的转换。请注意,这会创建一个的存储库foo,您不能在your-big-repo和之间推/拉foo

默认情况下convert extension未启用,因此将以下内容添加到您的 repohgrc文件或您的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来自your-big-repo.

如果你想删除所有的证据,fooyour-big-repo可以在你exclude libs/foo用来摆脱目录的地方进行另一次转换。

当您有多个这样的存储库并且您想将它们作为一个整体使用时,您应该查看subrepositories。此功能允许您在结帐中包含其他存储库 - 类似于svn:externals工作方式。请遵循该wiki 页面上的建议。

于 2009-05-28T15:33:19.983 回答
12

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

具体来说,请参阅从 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
于 2009-06-06T03:51:33.383 回答
6

我偶然发现了这个问题并找到了一种方法:使用符号链接(不幸的是Linux)

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

于 2011-01-31T03:13:16.590 回答
5

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

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

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

(2019) 该sparse扩展被合并到 Mercurial 4.3作为实验sparse扩展。NarrowHG 扩展作为扩展被合并到 Mercurial 4.6hgext.narrow

于 2016-11-01T07:21:45.873 回答
3

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

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

于 2009-05-28T11:58:36.703 回答
2

这对于Convert 扩展来说是直截了当的。

于 2010-04-30T02:48:04.093 回答