我知道mercurial有hgsubversion扩展名。但在我知道它是如何工作之前,我维护了两个独立的存储库,一个是SVN repo,一个是Hg repo。我最近在Hg存储库中进行了大部分更改,我需要将它们“推送”到svn存储库。
最直接的方法是从svn获取一个与hg中的一个修订版同步的修订版。
从那里,我更新到下一个版本(从Hg),然后提交它(到svn)。对许多变更集重复这些步骤是相当不方便的。有更方便的方法吗?
如果可能的话,解决方案适用于Windows操作系统。
此致
Afriza
答案 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
我目前做的事与你的做法类似。
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与中央服务器兼容,这是我们团队为共享代码存储库选择的。这种工作方式为您提供了两全其美的优势,而且没有我迄今为止注意到的缺点。