2

我有一个具有以下布局的颠覆回购:

svnrepo/projectA/trunk
svnrepo/projectA/tags
svnrepo/projectA/branches
svnrepo/projectB/trunk
svnrepo/projectB/tags
svnrepo/projectB/branches


我想将其移至具有修改后布局的 mercurial 存储库:
hgrepo/projectA
hgrepo/projectB

这样做的最佳方法是什么?我的一些想法是:

选项1

将 subversion 中的路径(使用 svn move)重新排列为中间格式:

svnrepo/trunk/projectA
svnrepo/trunk/projectB
svnrepo/tags/projectA
svnrepo/tags/projectB
svnrepo/branches/projectA
svnrepo/branches/projectB

然后在 svnrepo/trunk 上进行 hg 转换。这会混淆汞进口吗?

选项 2 hg 将每个项目/主干转换为单独的 hg 存储库。然后将它们合并到一个单独的 hg repo 中(使用 hg init、hg pull -f projectA 等)。我认为这将丢失第一个导入项目的分支名称和标签。

4

2 回答 2

6

在 Mercurial 中,将不相关的代码库存储在同一个存储库中是一个坏主意,因为它会

  • 合并非常复杂。合并将取决于对所有项目所做的更改,而不仅仅是您尝试合并的项目。
  • 导致存储和签出开销——据我所知,Mercurial 不支持仅签出存储库的子目录。您必须一次分支所有项目。

解决方案是将您的单个 Subversion 存储库转换为多个 Mercurial 存储库。大多数转换工具都支持这一点。

于 2009-08-25T18:14:56.397 回答
4

每个项目都应该在其自己的 Hg 存储库中(以便只能获取或标记特定项目)。

请记住,您在 Subversion 中看到的目录(主干、标签、分支)在任何现代 (D)VCS 中都不存在,其中分支和标签是一等公民(即由工具直接管理的元数据),而不是简单的由廉价副本(在 SVN 中)产生的目录。

这意味着当您转换 SVN 存储库时,您不应直接在 Hg 存储库的历史记录中存储任何“主干”、“标签”或“分支”目录。

您应该使用一种工具,例如hgsubversion将您的 SVN 存储库(例如“repo/projectA”)导入专用于 projectA 的 Hg 存储库。它将保留原始 SVN 项目的标签和分支,并将它们转换为 Hg 对象。
从其文档中

所有使用的更新hgpullsvn都在从 SVN URL 的最后一个组件命名的分支中进行(例如,如果 SVN URL 是svn://server/myproj/branches/feature-ZZZhgpullsvn将创建并使用命名的分支 ' feature-ZZZ')


如果您不想“转换”而是“同步”,tonfa建议hgsubversion,尽管它“由于大量重构而目前处于不断变化的状态”:

现在它还没有准备好用于生产。仅当您准备好破解它并深入研究 Mercurial 和/或 Subversion 的内部时,才应该使用它。

因为hgsvn还允许一些同步,hgpushsvn并且hgpullsvn......我现在会坚持下去hgsvn

于 2009-08-25T18:18:00.307 回答