Svn 将更改从一个Mercurial存储库添加到另一个存储库

Svn 将更改从一个Mercurial存储库添加到另一个存储库,svn,mercurial,mercurial-convert,Svn,Mercurial,Mercurial Convert,当我在谷歌代码中将我的项目的风险投资从SVN改为Mercurial时,我有点太急切了(我很有趣)。我所做的只是检查SVN的最新版本,然后将该检查作为新Mercurial回购协议的第一次修订。这显然造成了所有历史都消失的后果 后来,当我对Mercurial更为熟悉时,我意识到有一种“转换扩展”,允许您将SVN回购转换为Mercurial回购。现在我想做的是转换旧的SVN回购协议,然后将当前现有Mercurial回购协议中的所有变更集导入到转换后的回购协议中,除了第一次提交Mercurial之外 我

当我在谷歌代码中将我的项目的风险投资从SVN改为Mercurial时,我有点太急切了(我很有趣)。我所做的只是检查SVN的最新版本,然后将该检查作为新Mercurial回购协议的第一次修订。这显然造成了所有历史都消失的后果

后来,当我对Mercurial更为熟悉时,我意识到有一种“转换扩展”,允许您将SVN回购转换为Mercurial回购。现在我想做的是转换旧的SVN回购协议,然后将当前现有Mercurial回购协议中的所有变更集导入到转换后的回购协议中,除了第一次提交Mercurial之外

我已将SVN回购转换为本地Mercurial回购,但现在我陷入困境。我想我可以使用convert扩展将当前Mercurial存储库转换为转换后的存储库,并在第一次提交时删除拼接映射,但我似乎无法实现这一点

我还尝试使用convert With splice map将当前Mercurial repo中的所有变更集转换为转换后的变更集,并将当前版本中的第二个版本重新设置为旧SVN存储库中的最后一次提交,但我也无法实现这一点

为了更清楚地说明这一点,假设我有以下两个存储库:

A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)
现在,我想将这两者合并到包含以下内容的新存储库中:

C: revA1-revA2-revB2-revB3

只要您正在更改新修订版的哈希值(您是),您就可以使用
export
import
(或者
transplant
命令,该命令是这两个版本的包装器)

您已经完成了转换,这很好,现在进入回购B并执行以下操作:

hg export -o 'changeset-%R.patch' 1:tip
这将为repo B中的每个变更集创建一个变更集-##.补丁,第一个(编号为零)除外

现在转到repo C并导入它们:

hg import $(ls *.patch | sort -V)

如果revA2和revB1确实是相同的,那么这些都应该完全适用。

您可以使用“hg pull--force”从无关的存储库中引入更改

下面是一个简单的用法示例:

设置测试目录

C:\temp>mkdir hgtest
C:\temp>cd hgtest
C:\temp\hgtest>mkdir a
C:\temp\hgtest>mkdir b
C:\temp\hgtest>mkdir c
使存储库成为

C:\temp\hgtest>cd a
C:\temp\hgtest\a>hg init
C:\temp\hgtest\a>echo line one >> file.txt
C:\temp\hgtest\a>hg add file.txt
C:\temp\hgtest\a>hg ci -m "check in one"
C:\temp\hgtest\a>echo line two >> file.txt
C:\temp\hgtest\a>hg ci -m "check in two"
C:\temp\hgtest\a>echo line three >> file.txt
C:\temp\hgtest\a>hg ci -m "check in three"
将存储库设为b

C:\temp\hgtest\a>cd ..\b
C:\temp\hgtest\b>copy ..\a\file.txt file.txt
C:\temp\hgtest\b>hg init
C:\temp\hgtest\b>hg add file.txt
C:\temp\hgtest\b>hg ci -m "check in b one"
C:\temp\hgtest\b>echo line four >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b two"
C:\temp\hgtest\b>echo line five >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b three"
首先将存储库c作为a的克隆,然后从b中引入更改

C:\temp\hgtest\b>cd ..\c
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a .
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b
C:\temp\hgtest\c>hg merge
C:\temp\hgtest\c>hg ci -m "check in c one"

是的,问题是我第一次提交到存储库B中,但我不想这样做。除非我忽略了什么。您将拥有两个存储库中的所有修订(包括副本),但它应该合并而不发生冲突。与导出/导入解决方案相比,它会给您留下一个稍微混乱的修订历史记录。我似乎无法使导入与通配符一起工作,因此我必须为每个补丁文件执行一次导入,但无论如何,我只需执行一次。谢谢是的,通配符只能在您的shell进行全局扩展的unix上工作。在windows上,每个应用程序都需要这种逻辑,因此,如果您在windows上,则需要一个FOR循环,或者像以前一样运行每个应用程序。很高兴它起作用了。它可能在Linux上不起作用,原因很简单:变更集使用可变的数字编号(即1,2,3,…,10,11,…,100101等),导致
changeset-10.patch
changeset-2.patch
之前导入。您应该对它们进行排序:
hg import$(ls*.patch | sort-V)