如何在将存储库从Mercurial转换为Subversion时保留修订时间戳?

时间:2011-07-29 14:36:59

标签: svn version-control mercurial

由于工作政策,我被迫使用Subversion。目前我已经使用Mercurial开发了一些代码,我必须将此存储库转换为新的Subversion存储库。当前的Mercurial存储库还包含我从另一个SVN存储库(一个HW驱动程序)复制的遗留代码部分,此代码包含在复制代码时扩展的关键字(如$Id: ...$)。

我目前进行转换的方法是:

hg convert --dest-type svn repository.hg repository.svn

这很有效,遗憾的是它不会保留Mercurial修订版的时间戳。此外,它还扩展了某些遗留代码部分中的标记,其中有人写了$Id: ...$个东西。

问题:

  1. 如何导出到Subversion,保留修订的时间戳。
  2. 如何在不扩展$ Id:$ style关键字的情况下进行转换,或者更好的是,在转换时删除有问题的行。这是可能的,还是我必须在转换之前修改Mercurial转储的历史记录以确保没有关键字?
  3. 很抱歉,如果这个问题已经得到解答,我已经与谷歌和此处进行了密切的搜索,但我找不到这个问题的答案。特别是时间戳问题必须是其他人已经遇到过的问题。

    干杯, 小时。

    编辑:我已经创建了一个脚本,从Mercurial导出文件中提取时间戳并更新Subversion转储文件,这只不过是一个kludge,但它确实有效。不幸的是,$Id:问题仍未得到解决。

4 个答案:

答案 0 :(得分:3)

这是一个棘手的问题。为什么以不同方式处理解决方案:

https://bitbucket.org/durin42/hgsubversion/wiki/Home

这是Mercurial的扩展,它允许您作为SVN客户端访问它,它可以为您工作吗?

答案 1 :(得分:2)

我想重新建议hgsubversion作为解决方案。在正常情况下,它用于使用hg访问Subversion存储库,但如果您不害怕处理更改集的历史记录,则可以使用它将Mercurial存储库转换为Subversion。 (如果您知道如何使用变更集,则可以对该过程进行相当多的控制。)

基本上,您必须执行以下步骤:

  1. 使您的Mercurial历史呈线性(这是Subversion所必需的);您可以使用Collapse extension将历史记录的任何非线性区域折叠为单个变更集
  2. 创建一个Subversion存储库或目录,并将hg pull此SVN路径(使用hgsubversion)创建到Mercurial存储库中。 Subversion路径可能必须非空,但只要Mercurial存储库中的文件没有重叠,这应该没问题。
  3. 将Mercurial历史记录中的所有变更集重新基于Subversion历史记录。这是使用Rebase extension完成的。如果没有重叠,则应该是自动操作。
  4. 使用hg push将结果发送回Subversion。从Subversion存储库的前端开始的线性变化集将添加到Subversion路径中。
  5. 检查this blog article以获取可以使用的一些具体命令行命令。

答案 2 :(得分:2)

我在SVN上尝试了一次关键字替换,我不得不在工作文件夹中添加svn:keywords属性,指明要替换的关键字。因此,删除此属性应该可以胜任。

This article on Stack Overflow可能与此问题有关。

答案 3 :(得分:1)

据我所知,您现在的问题是:您有一个Hg存储库,该存储库曾经从SVN转换过,其中使用了关键字扩展。现在,扩展的关键字在Hg仓库中保持不变。您现在想要从Hg历史记录中删除这些关键字(或只是它们的扩展值),保留作者,日期/时间,提交消息,当然还有更改的文件。

这只是一个想法,我从来没有在实践中做到这一点,但是...只是说善变,我认为可以通过常见的mercurial行为,只为一个分支和没有标签和其他的组合来做到这一点分支:

  1. 克隆预期的源存储库
  2. 准备一个空的Hg存储库
  3. 对要更改的分支上的源代表处执行hg log > logfile.txt
  4. 解析文件,获取所有必要信息的结构化列表,如变更集编号,用户,日期和摘要,将其存储到允许轻松迭代的数据结构中
  5. 遍历列表(或直接使用日志文件)并...
    • 从目标库中删除所有工作文件
    • 将变更集从源存储库导出到目标存储库的工作副本
    • 更改您要执行的工作文件中的任何内容
    • hg addremove
    • hg commit -m ... -d ... -u ...
  6. 根据需要重复步骤5
  7. 缺点是更改集将获得新的哈希值,因此需要更新标记和书签。

    如果还有其他分支需要迁移:

    1. 将目标仓库更新为该分支的起点
    2. 和源代表也是
    3. 从上面的列表中插入步骤3到6
    4. 也许还有一些工作要做,但我认为这可行。如前所述,我从未这样做过。