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

时间:2009-11-16 21:34:34

标签: mercurial dvcs

是否可以克隆Mercurial存储库的一部分?假设存储库非常大,或者包含多个项目或多个分支。我可以只克隆部分存储库吗?

E.g。在Subversion中,您可能有trunkbranches。如果我只想获得主干(或其中一个分支),我可以请求[project]/trunk。如果我克隆hg repo,我会获得trunk和所有分支。这可能是我不想要的很多信息。我可以避免这个吗?

或者,如果我想在一个hg仓库中拥有多个项目,我该怎么做?即所以我可能会得到其中一个项目而忽略其他项目。

7 个答案:

答案 0 :(得分:37)

答案 1 :(得分:17)

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

引自UnderstandingMercurial

  

许多SVN / CVS用户希望主持   相关项目合二为一   库。这真的不是什么   是为了做,所以你应该试试   不同的工作方式。这个   特别是手段,你不能   只查看一个目录   库。

     

如果你绝对需要主持   多种项目中的一种   但是,您可以尝试使用元库   那个Subrepositories功能   介绍Mercurial 1.3或   年龄较大ForestExtension

答案 2 :(得分:16)

@Nick

“例如在Subversion中,你可能有主干和分支。如果我只想获得主干(或其中一个分支),我可以只请求[project] / trunk。如果我克隆hg repo,我会得到主干以及所有分支。这可能是我不想要的很多信息。我可以避免这样做吗?“

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

请记住,在DVCSes中,Mercurial中,分支通常是短暂的并且经常合并回来。如果你拉一个分支,你仍然会得到它与任何其他分支的共同历史。

答案 3 :(得分:6)

@nick说:

“这是一个相当大的遗漏,因为许多托管网站只提供一个回购。使用svn我可以有效地拥有尽可能多的回购,只需要从主要的一个分支。这个subrepos听起来像一个黑客。”

Subrepos(aka submodules)并不像“narrow clones”那样理想。但至少在一个托管站点的存储库中有许多不同的项目,您可以在一个存储库中拥有多个代码库。这将不允许您切片项目的一个存储库/子目录的不同部分,但它让您管理多个项目。你所做的是有许多命名分支,每个分支都以空(或null)变更集为根(即它们没有共同的根修订版)。跟踪分支会有点麻烦,但确实有效。

例如:

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

项目是无关的(虽然你可以合并它们):

> hg debugancestors
-1:000000000000 

最有用的是:您只能克隆所需的项目,而其他项目不会混入:

> hg clone <repository> -r project-1

此图表看起来像这样(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之前的行为令人惊讶)。但它 工作。

答案 4 :(得分:5)

Mercurial和Git只允许在整个存储库上进行克隆。因此,建议每个项目都有自己的存储库。

Mercurial有forest extension来轻松拥有项目存储库的“森林”。扩展将每个项目保存在一个单独的存储库中,但提供了更新/推送/拉取所有林存储库的选项。

答案 5 :(得分:2)

许多年后......可以让Mercurial使用hg clone -r branchname克隆一个分支(参见Mercurial clone from a branch)。使用Google的NarrowHG extension扩展程序,可以执行一个狭窄的克隆(有关类似问题,请参阅How do I clone a sub-folder of a repository in Mercurial?)。

答案 6 :(得分:0)

我知道这个问题问了将近10年后,我偶然发现 这个问题是偶然的。

有一个新的稀疏扩展,可以让您做到这一点。