是否可以克隆Mercurial存储库的一部分?假设存储库非常大,或者包含多个项目或多个分支。我可以只克隆部分存储库吗?
例如。在Subversion中,你可能有trunk
和branches
。如果我只想获得主干(或其中一个分支),我可以请求[project]/trunk
。如果我克隆hg repo,我会获得trunk和所有分支。这可能是我不想要的很多信息。我可以避免这个吗?
或者,如果我想在一个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
,并将其放在要拆分的repo的目录中。比方说,你有C:\repos\ReallyBigProject
,子文件夹是C:\repos\ReallyBigProject\small-project
。在命令提示符下,运行:
cd\repos\ReallyBigProject
split.cmd small-project
这将创建C:\repos\small-project
,其中包含较大项目的相关修订历史记录。
默认情况下不启用convert
。您需要确保.hg\hgrc
文件中存在以下行(在我的示例中为c:\repos\ReallyBigProject\.hg\hgrc
):
[extensions]
hgext.convert=
据我所知,这是不可能的。但与Subversrion相比,克隆整个回购可能并不比SVN的分支慢。
许多SVN / CVS用户希望在一个存储库中共同托管相关项目。这真的不是hg的用途,所以你应该尝试不同的工作方式。这尤其意味着,您不能只检出存储库的一个目录。
如果您绝对需要在某种元库中托管多个项目,您可以尝试使用Mercurial 1.3或旧版Subrepositories引入的ForestExtension功能。
@缺口
“例如在Subversion中,你可能有主干和分支。如果我只想获得主干(或其中一个分支),我可以请求[project] / trunk。如果我克隆hg repo,我将获得主干和所有这可能是我不想要的很多信息。我可以避免这样做吗?“
绝对。只需使用hg clone -r <branch>
并获得您想要的分支。如果你有很多分支,你需要一个-r <branch>
。 <branch>
不一定是一个命名分支:你可以简单地拥有多个未命名的头部(或使用书签命名的头部,尽管那些仍然不完美,因为目前它们没有出现推/拉/克隆)。
请记住,在DVCSes中,Mercurial中,分支通常是短暂的并且经常合并回来。如果你拉一个分支,你仍然会得到它与任何其他分支的共同历史。
@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版之前的行为在克隆时是令人惊讶的)。但它确实有效。
Mercurial和Git只允许在整个存储库上进行克隆。因此,建议每个项目都有自己的存储库。
Mercurial有一个forest
extension来轻松拥有项目存储库的“森林”。扩展将每个项目保存在单独的存储库中,但提供了将所有林存储库一起更新/推送/拉出的选项。
许多年后......可以让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?获取类似问题)。
我知道问这个问题差不多10年了,我偶然发现了这个问题。
有一个新的mercurial扩展调用稀疏,允许你这样做。