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

我有一个Mercurial存储库包含一些相关的项目。 我只想分支其中的一个项目在其他地方工作。

克隆只是一个可能的存储库的一部分,是否是实现这一目标的正确途径?

你想要的是一个狭义的部分的克隆 ,但不幸的是还没有被支持。

如果你已经有了一个大的仓库,并且意识到把它分成几个较小的仓库是有意义的,那么你可以使用convert扩展来进行Mercurial到Mercurial的转换 。 请注意,这将创build一个新的存储库foo ,你不能推/拉your-big-repofoo

convert extension默认是不启用的,所以把下面的hgrc添加到你的repo的hgrc文件或者你的mercurial.ini文件中:

 [extensions] hgext.convert= 

然后创build一个map.txt文件

 include "libs/foo" rename "libs/foo" . 

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

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

这将使foo成为your-big-repo libs/foo中的libs/foo文件夹的完整历史logginglibs/foo

如果你想从your-big-repo删除foo所有证据,你可以使用exclude libs/foo来删除目录。

当你有几个这样的存储库,你想把它们作为一个整体来使用时,你应该看看子库 。 这个function可以让你在结账中包含其他的仓库 – 和svn:externals工作方式类似。 请遵循该wiki页面上的build议 。

而不是做一个部分克隆,你可以使用转换扩展来将你的库分割成多个库。

具体来说,请参阅“ 从Mercurial转换 ”一节:

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

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

我偶然发现了这个问题,并find了一个办法:使用符号链接(仅Linux不幸)

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

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

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

这是直接与转换扩展 。

(2016年下半年)Mainline Mercurial仍然不支持“狭义克隆”,但有第三方扩展以不同的方式解决问题。

如果你只能应付一个狭义的结账 (也就是“稀疏结账”或“通过文件path进行部分结账”),那么来自hg-experiments存储库 (查看hgext3rd/目录)的Facebook的sparse.py扩展可能是可行的。 在这种情况下,您仍然克隆完整的历史logging(因此.hg目录不会更小),但是您的工作目录仅显示/作用于完整存储库的一个子集。

或者,Google已经创build了一个缩小克隆的NarrowHG扩展 (又称“通过文件path部分克隆”)。 您将需要控制服务器,客户端并愿意使用实验性function,但是它确实将克隆的.hg复制历史限制在原始存储库中的子集。