【问题标题】:How to push revisions back from mercurial to subversion?如何将修订从 mercurial 推回颠覆?
【发布时间】:2011-02-13 10:25:52
【问题描述】:

您好,我已将本地 svn 存储库转换为 mercurial,在 hg 中提交了几个修订版,现在希望将更改恢复到 svn。
任何人都可以建议如何做到这一点?

我找到了https://www.mercurial-scm.org/wiki/WorkingWithSubversion#With_Convert_extension,但不幸的是,我没有按照那里的描述进行转换(只是在本地 repo 上进行了 hg 转换),也没有使用 MQ。

有没有机会将个别修订推回颠覆,或者我能做到的只是改变的本地差异?

【问题讨论】:

  • 我经历了一个相当复杂的过程,涉及设置一个同时是 Mercurial 和 Subversion 工作副本的目录。这很容易出错,但对我有用。
  • 您是否要长期支持两个版本控制系统?这听起来是个坏主意。为什么需要这个?
  • @robert: 不,这只是一个临时分叉,我现在只想将更改恢复到 svn

标签: svn mercurial synchronization


【解决方案1】:

我想你也许可以使用hgsubversion

我会尝试这样做:

  1. 使用 hgsubversion 克隆 SVN 存储库。
  2. 尝试将您的更改从旧存储库移至新存储库。这可能被证明是棘手的。以下是一些解决方案:
    • Adding changes from one Mercurial repository to another,它使用exportimport 命令,或transplant 扩展。
    • 也许您可以使用hg pull --force 从那个不相关的存储库中提取变更集。 (见How to combine two projects in Mercurial?)但是,在那之后,您需要运行merge,当您将更改推送回SVN时可能会出现错误。所以也许你可以尝试使用rebasemq 扩展。
    • 也许您可以使用mq 扩展在旧存储库上生成一堆补丁,将它们复制到新存储库,然后应用它们。
    • 如果所有其他方法都失败了,您可以通过重新执行之前所做的更改来“手动”逐个应用每个变更集。 (hg diff -c rev_id 命令会很有用)
  3. 在您的 hgsubversion 副本中进行所有更改,只需 push 它们,它们就会被添加到 SVN 存储库中。
  4. ...?
  5. 利润!

【讨论】:

    【解决方案2】:

    这并不像人们想象的那么难。从长远来看,我确实建议您按照其他答案的建议使用 hgsubversion,但有一个非常简单的短期解决方案。

    1. 检查 hg 存储库中的所有内容
    2. hg up -r [从 svn 转换的最新版本]
    3. 从 svn 签出到一个干净的目录
    4. 将 .hg 目录从您的 hg 存储库复制到您的 svn checkout
    5. 将所有这些 svn 更改检查到您的 hg 存储库中(记得添加/删除文件...这一步需要一点时间,因为 hg 这次必须扫描所有内容)
    6. 使用 hg 合并您现在拥有的两个头(假设 svn 已在您前面移动)
    7. 通过将更改拉回原始 hg 存储库并在那里进行测试来测试构建(如果需要)(这样做的目的是保持“hg+svn 存储库”干净,以便在相应的工具中轻松发现丢失/添加的文件)
    8. 使用 svn 签入所有更改(记得添加/删除文件)

    一旦你有了这个,实际上并不太难同时使用这两个系统......但如果你需要这个长期的解决方案,hgsubversion 可能是一个更好的解决方案。我个人使用上述系统是因为 hgsubversion 无法处理我们过去对 svn 存储库所做的一些相当奇怪的事情。

    编辑:我假设 svn trunk 已经在你前面移动了这个解决方案;如果不是这种情况,这个过程就会变得简单得多。如果你想单独合并每个 hg 版本,你应该没有理由不能这样做,只是需要更多的工作。

    • 将 hg rev 1 合并到 svn 提示...在 svn 中提交
    • 将 hg rev 2 合并到 svn 提示...在 svn 中提交
    • 合并 hg ...

    【讨论】:

    • 我想保留单独的修订版——即将每个 hg 提交转换为具有相同变更集和注释的 svn 提交。但这不是您的解决方案所能达到的,对吧。除此之外,这是一个不错且简单的解决方案。
    【解决方案3】:

    我个人在工作中使用 Mercurial 来处理我们的 subversion 存储库。我强烈建议您使用 hgsubversion 进行克隆,因为它可以在进行简单推送时提交回 subversion 存储库。唯一的问题是您必须学习如何重新调整您的更改,因为您无法使用 mercurial 的合并功能(颠覆根本无法理解变更集可能有两个父项)。

    如果您想删除 subversion 存储库并将其替换为 mercurial,则您所做的转换存储库非常有用。不幸的是,这是不可能的(除非你想开始玩差异)

    但是,如果您使用 hgsubversion 克隆 svn 存储库,您可能(假设没有合并)能够将您在当前转换后的 mercurial depot 上所做的更改拉入其中。如果有合并,则必须在传输更改之前对其进行“线性化”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多