【问题标题】:Split Subversion repository into multiple Mercurial repositories?将 Subversion 存储库拆分为多个 Mercurial 存储库?
【发布时间】:2010-11-17 23:39:29
【问题描述】:

我们正在从 Subversion 迁移到 Mercurial,并且在 SVN->Hg 转换过程中遇到了问题。现在,我们的单个 SVN 存储库包含几个不同“项目”的代码,我们希望在迁移过程中将它们分开。我们的 SVN 存储库组织为:

.
|-- proj1
|   |-- branches
|   |-- tags
|   `-- trunk
`-- proj2
    |-- branches
    |-- tags
    `-- trunk

我们想简单地将proj1proj2 创建为他们自己的Hg 存储库。当然,我们也不希望proj1 的特定历史记录出现在proj2 的日志中。现在,当hg convert 进行转换时,它只是非常笨拙地读取所有文件,甚至没有区分分支和主干。

hg convert中按目录过滤和识别SVN分支的流程是什么?

【问题讨论】:

  • +1 这是一个非常重要的问题,与许多公司相关。
  • @erjiang:如果您很高兴使用 svn 在 1 个 repo 中使用 2 个项目,为什么不遵循相同的(不正确的)架构和 mercurial? ;-)))
  • 我将使用“使用 SVN 整理混乱然后导入 Hg”又名“如何将 SVN 存储库拆分为两个项目并为每个项目保留适当的数据”...您正试图将两个项目硬塞在一个旗帜下。至少,我现在的立场是这样的。
  • All in one 在 svn 中是非常好的设置,因为它可以只检出树的一部分。 Mercurial(和其他 DVCS)只是不提供该功能,这就是为什么 convert 和 filemap 可以很容易地拆分 repo。
  • 这里有类似的问题:stackoverflow.com/questions/3066298/…

标签: svn mercurial mercurial-convert


【解决方案1】:

感谢ConvertExtension wiki page

我尝试了 Ry4an 的方法,但它的缺点是必须先将 SVN 存储库转换为中间 Mercurial 存储库,然后再拆分所有内容,并且无法识别分支、主干和标签,因为每个都有两个项目有自己的分支、主干和标签。

我发现手动指定分支、主干和标签目录非常适合一次将一个项目从 SVN 转换为 Mercurial:

hg \
--config convert.svn.trunk=proj1/trunk \
--config convert.svn.branches=proj1/branches \
--config convert.svn.tags=proj1/tags \
convert --authors authors.txt original-svn-dir hg-proj1

这将负责识别 SVN 分支、标签和主干过滤器,同时仅针对 proj1 修订。然后,我只是重复了proj2

【讨论】:

  • 很高兴你能成功。多个 svn->hg 对话的缺点是 svn->hg 片段比 hg->hg 片段花费的时间要长得多,因此考虑到获取 authormap、拆分等的迭代性质,正确执行 svn->hg 一次,并且为每个项目执行(和重做)hg->hg 通常可以节省时间。此外,如果您要使用 convert 对增量转换的支持(即:在一个月内再次执行此操作,引入新的 svn 内容而不更改 hg hashid),您需要一个 svn convert。
  • 这是一个本地->本地转换,所以在时间上还不错。
【解决方案2】:

另一种解决方法是使用 svnadmin dump 和 svndumpfilter 将 svn 存储库拆分为每个项目的一个新 svn 存储库,如 svn 文档中所述。 Splitting repositories by filtering repository history

【讨论】:

    【解决方案3】:

    这很容易按照您的建议使用“转换”扩展程序完成。流程如下:

    1. 做一个hg convert SVNREPO all-in-one-mercurial-repo 从 svn 到 mercurial 的所有东西
    2. 执行多个 hg convert --filemap projectfilemap.txt all-in-one-mercurial-repo project-repo 命令 -- 每个项目一个

    这些文件映射中包含如下行:

    exclude proj1
    rename proj2 .
    

    这将是从一体式 mercurial 存储库中仅提取项目二的存储库时使用的文件映射。您可能需要在这些地图中列出每个单独的文件,但我认为目录是可以的。

    关于 SO 的另一个问题在这里我回答了几乎相同的问题并粘贴了一个完整的示例,但这应该足以让你继续前进。

    【讨论】:

    • 也许可以贴上一个问题的链接?
    • 哦,还有,hg convert可以理解git-svn之类的分支吗?
    • 是的,如果您使用了普通的分支/、标签/、树干/树结构,它就可以很好地拾取它们。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多