我可以克隆部分Mercurial存储库吗?

是否有可能克隆部分Mercurial存储库? 比方说,这个资源库非常大,或者包含多个项目或多个分支。 我可以克隆仅部分存储库吗?

例如在Subversion中,你可能有trunkbranches 。 如果我只想得到主干(或其中一个分支),我只需要[project]/trunk 。 如果我克隆hg回购,我会得到树干和所有的分支机构。 这可能是我不想要的很多信息。 我能避免得到这个吗?

或者,如果我想在一个HG回购中有多个项目,我该怎么做? 也就是说,我可能只是得到一个项目而忽视其他项目。

是的你可以。 我相信你已经开始了,但为了稍后在这里漫步的人,我遵循了ConvertExtension的文档,并写了一个简单的批处理脚本:

 @echo off echo Converting %1 REM Create the file map echo include %1 > ~myfilemap echo rename %1 . >> ~myfilemap REM Run the convert process hg convert --filemap ~myfilemap .\ ..\%1 REM Delete the file map del ~myfilemap cd ..\%1 REM update the new repo--to create the files hg update 

将其命名为split.cmd ,并将其放在要分割的回购目录中。 比如说你有C:\repos\ReallyBigProject ,子文件夹是C:\repos\ReallyBigProject\small-project 。 在命令提示符下,运行:

 cd\repos\ReallyBigProject split.cmd small-project 

这将创buildC:\repos\small-project其中包含大型项目修订的相关历史logging。

convert没有默认启用。 您需要确保.hg\hgrc文件中存在以下行(在我的示例中为c:\repos\ReallyBigProject\.hg\hgrc ):

 [extensions] hgext.convert= 

@缺口

“例如在Subversion中,你可能有树干和树枝,如果我只想得到树干(或其中一个树枝),我可以申请[project] / trunk,如果我克隆了hg repo,这可能是很多我不想要的信息,我可以避免这样做吗?

绝对。 只需使用hg clone -r <branch>并只获得你想要的分支。 如果你有很多分支,你需要一个-r <branch><branch>不一定是一个命名分支:你可以简单地拥有多个未命名的头(或使用书签的名字头,尽pipe这些头还不完美,因为目前他们没有显示推/拉/克隆) 。

请记住,在DVCSes中,Mercurial之间的分支往往是短命的,经常合并到对方。 如果你拉一个分支,你仍然会得到它与任何其他分支的共同历史。

据我所知,这是不可能的。 但是与Subversrion相比,克隆整个回购可能不会比SVN的一个分支慢。

从UnderstandingMercurial引用:

许多SVN / CVS用户希望将相关的项目放在一个存储库中。 这实际上不是什么呃,所以你应该尝试一种不同的工作方式。 这尤其意味着,你不能只检出一个存储库的一个目录。

如果您绝对需要在一个元存储库中托pipe多个项目,您可以尝试使用Mercurial 1.3或更早版本的ForestExtension引入的Subrepositoriesfunction。

@尼克说:

“这是一个很大的漏洞,因为很多托pipe站点只提供一个回购站点,通过svn,我只需要从主站点获得一个分支,就可以有效地获得更多的回购站点。

Subrepos(aka submodules)并不像“狭义克隆”那样理想。 但至less在一个托pipe站点的仓库中有许多不同的项目,你可以在一个仓库中拥有多个代码库。 这将不允许您分割项目的一个存储库/子目录的不同部分,但它可以让您pipe理多个项目。 你所做的是有很多命名分支,每个分支根植于空(或空)变更集(即它们没有共同的根本修订)。 跟踪分支可能会有点杂乱,但它确实有效。

例如:

 hg init hg branch project-1 # Changes, commits, repeated as needed hg update null hg branch project-2 # Changes, commits, repeated as needed 

你现在可以看到你所有的项目:

 > hg branches project-2 5:42c2beffe780 project-1 2:43fd60024328 

这些项目是不相关的(尽pipe你可以合并它们):

 > hg debugancestors -1:000000000000 

最有用的是:你可以只克隆你想要的项目,其他的不会混入:

 > hg clone <repository> -r project-1 

这个graphics看起来像这样( hg log -qG ):

 @ 5 | project-2 | {tip} | o 4 | project-2 | o 3 | project-2 o 2 | project-1 | o 1 | project-1 | o 0 | project-1 

您可以根据需要为其中的多个项目执行此操作,并使用hg branches列出每个项目,并使用hg update在它们之间跳转。 这需要注意,因为命名分支支持并不完美。 一件事情并不总是直观的(在Mercurial 1.4中阅读hg clone -u – 在克隆之前,1.4之前的行为是令人惊讶的)。 但它确实有效。

Mercurial和Git只允许克隆整个存储库。 因此build议每个项目都有自己的存储库。

Mercurial有一个扩展的forest ,可以为项目资源库提供一个“森林”。 该扩展将每个项目保存在一个单独的存储库中,但提供了将所有林存储库更新/推/拉到一起的选项。

许多年以后…有可能要求Mercurial使用hg clone -r branchname 克隆一个分支 (请参阅分支中的Mercurial克隆 )。 通过Google的NarrowHG扩展扩展,可以执行一个狭窄的克隆(请参阅如何在Mercurial中克隆存储库的子文件夹?以获取类似的问题)。