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

Posted

技术标签:

【中文标题】如何在 Mercurial 中克隆存储库的子文件夹?【英文标题】:How do I clone a sub-folder of a repository in Mercurial? 【发布时间】:2010-10-29 13:16:58 【问题描述】:

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

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

【问题讨论】:

据我所知,这是不将多个项目放在一个仓库中的原因之一。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

如果您已经有一个大型存储库,并且您意识到将其拆分为几个较小的存储库是有意义的,那么您可以使用convert extension 进行 Mercurial 到 Mercurial 的转换。请注意,这会创建一个 new 存储库 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 成为一个存储库,其中包含来自your-big-repolibs/foo 文件夹的完整历史记录。

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

如果您有多个这样的存储库并且想要将它们作为一个整体使用,那么您应该查看subrepositories。此功能允许您在结帐中包含其他存储库 - 类似于 svn:externals 的工作方式。请关注该维基页面上的recommendations。

【讨论】:

谢谢 - 我找到了我需要做的解决方法。看到所涉及的问题很有趣。 啊! “我发现了一个真正了不起的证据,这个空白太窄了,无法包含。” 好的,如果克隆子目录完成,你将如何将更改合并回原始目录? @martin-geisler 这些天narrow and partial cloning are concepts that are part of Mercurial itself。我tried to update your comment,但被告知更改是“旨在解决帖子作者的问题,作为编辑没有意义”,因此发表了此评论。【参考方案3】:

您可以使用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

【讨论】:

【参考方案4】:

Convert extension 直截了当。

【讨论】:

我猜这是因为该解决方案并没有真正让您从存储库中克隆子目录。相反,它可以让您将现有存储库转换为新的更小的存储库,然后您可以克隆。 1) 如上所述,您没有回答原始问题提出的问题。 2)你没有解释原来的问题是不可能的。你只是提供一些不同的东西。 3)你给出一个链接,而不是实际解释。 @MartinGeisler 需要注意的是,虽然转换解决方案的名称可能与部分克隆的名称略有不同,但它允许执行部分克隆允许的任何操作,包括推送到远程存储库并从中提取 AFAIK。我相信您知道这一点,但我发布此说明主要是为了最终的未来读者:) @brandizzi:转换后的 repo 将具有新的变更集 ID,因此您无法退回原始版本。您可以做的是重复转换原始存储库并从转换后的内容中提取到您现有的部分克隆。这使您可以与大型存储库中的开发保持同步,但这是一种单向策略,您需要手动(例如使用hg export)将更改复制回原始存储库。 @MartinGeisler 实际上,你可以!您只需要使用-f 标志。以this script 为例。 (注意:需要 convert 和 graphlog 扩展。)【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

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

(2019)sparse extension was merged into Mercurial 4.3 作为实验性sparse extension。 NarrowHG extension was merged into Mercurial 4.6 作为 hgext.narrow 扩展名。

【讨论】:

以上是关于如何在 Mercurial 中克隆存储库的子文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

Mercurial:两个Windows开发人员,我的PC上的中央存储库。我应该在中央存储库中工作还是从中克隆?

在推送之前丢弃 Mercurial 中的本地分支

如何从 Mercurial 克隆中删除工作副本?

将 Mercurial 存储库移动到现有 git 存储库的子目录中

将存储库克隆到本地文件系统上的文件夹的 Mercurial hg 克隆语法是啥

从 C# 克隆 Mercurial 存储库?