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

如何在Mercurial中克隆存储库的子文件夹?,mercurial,clone,dvcs,Mercurial,Clone,Dvcs,我有一个Mercurial存储库,其中包含一些相关的项目。我只想把这些项目中的一个分支到其他地方去做 克隆只是存储库的一部分是可能的吗?这是实现这一点的正确方法吗?不可能,hg clone将克隆整个存储库 您可以查看子存储库扩展,它允许您在存储库中拥有存储库,这可能符合您的需要。您想要的是一个,但遗憾的是,这还不受支持 如果您已经拥有一个大型存储库,并且您意识到将其拆分为几个较小的存储库是有意义的,那么您可以使用来执行从Mercurial到Mercurial的转换。请注意,这将创建一个新的存储库

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


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

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

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

您想要的是一个,但遗憾的是,这还不受支持

如果您已经拥有一个大型存储库,并且您意识到将其拆分为几个较小的存储库是有意义的,那么您可以使用来执行从Mercurial到Mercurial的转换。请注意,这将创建一个新的存储库
foo
,您不能在
您的大型回购
foo
之间推拉

默认情况下,
convert扩展名
未启用,因此请将以下内容添加到回购协议的
hgrc
文件或您的
mercurial.ini
文件中:

[extensions]
hgext.convert=
然后使用创建一个
map.txt
文件

include "libs/foo"
rename "libs/foo" .
(注意,即使在Windows上也可以使用正斜杠)并运行

这将使
foo
成为一个存储库,其中包含
libs/foo
文件夹在
您的大型repo
中的完整历史记录

如果您想从
您的大额回购
中删除
foo
的所有证据,您可以进行另一次转换,使用
exclude libs/foo
删除目录


如果您有几个这样的存储库,并且希望将它们作为一个整体使用,那么您应该查看。此功能允许您在签出中包含其他存储库-类似于
svn:externals
的工作方式。请按照该wiki页面上的进行操作。

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

具体请参见以下章节:

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

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

这是一个直截了当的问题。

我无意中发现了这个问题,并找到了一种解决方法:使用符号链接(不幸的是,仅限Linux)

例如,如果存储库中只需要
/project
,请在计算机上克隆另一个文件夹中的repo,然后使用
ln-s/repo/location/project
。Mercurial将处理这一问题(2016年末)。主线Mercurial仍然没有打包对“窄克隆”的支持,但有第三方扩展以不同的方式解决这一问题

如果您可以处理一个狭窄的签出(也称为“稀疏签出”或“通过文件路径部分签出”),那么Facebook的
sparse.py
扩展名(查看
hgext3rd/
目录)可能是可行的。在这种情况下,您仍然可以克隆完整的历史记录(因此.hg目录不会更小),但您的工作目录只显示/操作完整存储库的一个子集

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


(2019)作为实验性的。作为
htext.slown
扩展,我已经找到了一个解决方法,可以解决我需要做的事情。很有兴趣看到涉及的问题。啊!“我发现了一个真正奇妙的证据,这个空白太窄了,无法容纳。”好吧,如果完成了subdir的克隆,你将如何将更改合并回原始目录?@martin geisler这些天来。但有人告诉我,这一更改“旨在针对文章作者,作为编辑毫无意义”,因此我发表了这一评论。据我所知,这是不将多个项目放在一个repo中的一个原因。我猜这是因为该解决方案实际上不允许您从存储库克隆子目录。相反,它允许您将现有存储库转换为新的、更小的存储库,然后进行克隆。1)如上所述,您没有回答原始问题所提出的问题。2) 你没有解释原来的问题是不可能的。你只是提供一些不同的东西。3) 您给出的是一个链接,而不是实际解释。@MartinGeisler只是要注意,虽然convert解决方案的名称可能与我们称之为部分克隆的名称稍有不同,但它允许我们执行部分克隆允许的任何操作,包括推送到远程存储库并从中自动拉出。我相信你知道这一点,但我主要是为了将来的读者发布这篇文章:)@brandizzi:转换后的回购协议将有新的变更集ID,因此你不能推回原始版本。您可以做的是重复转换原始存储库,并从已转换的存储库中提取到现有的部分克隆。这使您能够与大型回购协议中的开发保持同步,但这是一种单向策略,您需要手动(使用,比如,
hg export
)将更改复制回原始回购协议。@MartinGeisler实际上,您可以!您只需要使用
-f
标志。请看一个例子。(注意:需要convert和graphlog扩展名。)
$ echo include subfoo > /tmp/myfilemap
$ echo rename subfoo . >> /tmp/myfilemap
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo