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

Nic*_*ick 44 mercurial dvcs

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

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

或者,如果我想在一个hg仓库中拥有多个项目,我该怎么做?也就是说,我可能会得到其中一个项目并忽略其他项目.

And*_*ugh 37

是的你可以.我相信你已经继续前进了,但是为了那些稍后会在这里闲逛的人,我跟着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                                  
Run Code Online (Sandbox Code Playgroud)

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

cd\repos\ReallyBigProject
split.cmd small-project
Run Code Online (Sandbox Code Playgroud)

这将创建C:\repos\small-project一个较大项目的相关修订历史片段.

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

[extensions]
hgext.convert=
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这会让你推迟任何改变.您可以将本地更改导出到修补程序文件,然后将其导入到上游的完整本地副本,但这样就会首先击败部分克隆的点.此外,OP没有具体说明他是否需要浅层克隆(相同树,更少修订)或部分克隆(子树,部分或全部修订).无论哪种情况,转换都会改变哈希值. (3认同)

Sav*_*man 17

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

引自UnderstandingMercurial:

许多SVN/CVS用户希望在一个存储库中共同托管相关项目.这真的不是hg的用途,所以你应该尝试不同的工作方式.这尤其意味着,您不能只检出存储库的一个目录.

如果您绝对需要在某种元库中托管多个项目,则可以尝试使用Mercurial 1.3或旧版ForestExtension引入的子库存功能.

  • 从集中的角度来看,这是有道理的.但Mercurial和Git是分散的.1个项目= 1个回购,这就是它的工作方式. (7认同)
  • @Nick:不,这听起来像托管服务提供商不了解分布式版本控制. (6认同)

qua*_*ark 16

@缺口

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

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

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


qua*_*ark 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
Run Code Online (Sandbox Code Playgroud)

您现在可以看到所有项目:

> hg branches
project-2                      5:42c2beffe780
project-1                      2:43fd60024328
Run Code Online (Sandbox Code Playgroud)

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

> hg debugancestors
-1:000000000000 
Run Code Online (Sandbox Code Playgroud)

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

> hg clone <repository> -r project-1
Run Code Online (Sandbox Code Playgroud)

这个图形看起来像这样(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
Run Code Online (Sandbox Code Playgroud)

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


not*_*oop 5

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

Mercurial有一个forest扩展,可以轻松拥有项目存储库的"森林".扩展将每个项目保存在单独的存储库中,但提供了将所有林存储库一起更新/推送/拉出的选项.

  • 如今,推荐使用subrepo而不是森林. (4认同)