如何将变更集从hg存储库导出到svn存储库

时间:2009-11-30 03:27:45

标签: svn git mercurial

我知道mercurial有hgsubversion扩展名。但在我知道它是如何工作之前,我维护了两个独立的存储库,一个是SVN repo,一个是Hg repo。我最近在Hg存储库中进行了大部分更改,我需要将它们“推送”到svn存储库。

最直接的方法是从svn获取一个与hg中的一个修订版同步的修订版。

从那里,我更新到下一个版本(从Hg),然后提交它(到svn)。对许多变更集重复这些步骤是相当不方便的。有更方便的方法吗?

如果可能的话,解决方案适用于Windows操作系统。

此致

Afriza

5 个答案:

答案 0 :(得分:2)

如果您正在谈论一系列线性变更集(没有合并),您可以使用shell for循环

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update $therev
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

从签出修订版循环到提示,并依次提交每个提交保留提交消息。你可能需要做一些花哨的arround添加/删除文件。

答案 1 :(得分:2)

没有。

您可能已经看过此链接。目前尚未正式支持与svn repos交互。我不会写一个shell脚本来自动执行此操作。这可能会产生意想不到的结果搞砸了回购(但请看下面的工作流程)

https://www.mercurial-scm.org/wiki/WorkingWithSubversion

我目前做的事与你的做法类似。

  1. 从svn repos结账,将其保存在$ HOME / svnhgrepos / project1下
  2. 转到$ HOME / svnhgrepos / project1,hg init,hg commit
  3. 更改$ HOME / svnhgrepos / project1 / .hg / hgrc以在推送时自动更新
  4. 将$ HOME / svnhgrepos / project1克隆到$ HOME / code / project1-clone。
  5. 转到$ HOME / code / project1-clone,hg qinit(mercurial queues)
  6. 进行所有开发,提交它(每个功能/ bugfix只有一个变更集)     并将其推送到$ HOME / svnhgrepos / project1
  7. 转到$ HOME / svnhgrepos / project1,然后执行'svn ci'
  8. 我的设置中没有完成此步骤。    现在你可以写一个hg钩子,自动执行'hg update'和'svn commit'
    
       e.g (i have not tested this)
       in $HOME/svnhgrepos/project1/.hg/hgrc   
       [hooks]
       changegroup.hg-update = hg update >&2
       changegroup.svn-commit = svn commit -m "hg log --template '{desc}' -r ."
       
    

答案 2 :(得分:1)

我接受了Ry4an的回答并添加了添加/删除处理。这是:

for therev in $(seq $(hg id -n -r .) $(hg id -n -r tip)) ; do
  hg update -C $therev
  svn st | perl -lne 'if (/^([?!])\s*(\S*)/) { my $command = ($1 eq "?") ? "add" : "rm"; my $fname=$2; $fname =~ s[\\][\/]g; system(qq(svn $command $fname));}'
  svn commit -m "$(hg log --template '{desc}' -r .)"
done

我发现在涉及分支时需要-C。但是,这非常难看,因为文件在分支之间切换时会被删除并重新添加。通常,重命名信息也会丢失,当然还有原始提交者的日期和身份。

答案 3 :(得分:0)

看起来你可以使用hg convert来追溯你想做的事情。启用ConvertExtension,然后执行hg convert -d svn file/path/to/mercurial/repo svn://repo/path/虽然我没有尝试过。

答案 4 :(得分:0)

这可能不完全是您想要的,但是我认为您可能会在某个时候找到这种用法。而且,其他人也可能...

我在Windows 7 OS上工作,同时使用Mercurial(TortoiseHg)和Subversion(TortoiseSVN)进行源代码控制。为什么?好吧,我们在大约8人的非常小的团队中发现,Mercurial可以很方便地用作“个人”安全网,但是对于我们的某些人(例如, Verilog)。张开双臂不欢迎整个“推”和“拉”想法,要求将一堆其他人的更改合并到您的更改中。这似乎很麻烦,在一个案例中,一名工程师由于误解了Mercurial如何做这些事情的某些细微差别而失去了所有工作。幸运的是,还有另一份副本(她是位聪明的工程师!),所以一切都没有丢失,但是它证明了Mercurial的操作可能令人困惑且难以预测,至少对于某些人而言。

Mercurial的优势(IMO)使得您可以轻松地在各个开发分支之间进行切换,并且可以使用TortoiseHg工具可视化版本树并选择要处理的内容。您可以非常轻松地(并迅速!)保存工作,抢占另一个分支或开始一个新的分支,进行一些实验或寻求另一种方法。作为便捷的人身安全网和分支交换工作台工具,它非常出色。在开发和测试代码时,我一直都在使用它。

另一方面,Subversion使得非常易于使用的“团队”服务器。人们容易理解它是如何工作的。标记和分支不是那么直观,但是我们并不经常这样做。更新,合并和签入似乎更加直观且易于管理。

事实证明,您实际上可以同时使用Mercurial和Subversion来管理单个工作副本!您可以从SVN签出,然后使用Mercurial在此处“创建存储库”,或者以其他方式进行操作。您必须编辑SVN的“忽略”设置,以忽略工作副本文件夹中的所有.hgxxxx文件,并使Mercurial忽略.svn目录。完成此操作后,任何一个系统的命令行或Shell扩展工具都将继续按其原样工作,现在您将在两个不同的存储库中管理代码!

一开始我很怀疑,但是我真的想要Mercurial的日常便利,因为Subversion与中央服务器兼容,这是我们团队为共享代码存储库选择的。这种工作方式为您提供了两全其美的优势,而且没有我迄今为止注意到的缺点。