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

时间:2010-04-21 16:27:09

标签: svn mercurial hg-convert

将我的项目FakeItEasy的VCS从SVN更改为Google Code上的Mercurial时,我有点过于渴望(我很有趣)。我所做的只是检查SVN的最新版本,然后将结帐作为新Mercurial仓库的第一个修订版。这显然会导致所有历史遗失。

后来当我对Mercurial有了更好的习惯时,我意识到有一个“转换扩展”这样的东西允许你将SVN repo转换为Mercurial仓库。现在我要做的是转换旧的SVN仓库,然后将当前存在的Mercurial仓库中的所有变更集导入到此转换后的仓库中,但是对Mercurial的第一次提交。

我已经将SVN回购转换为当地的Mercurial回购,但现在是我被困的时候。我以为我能够使用转换扩展来将当前的Mercurial存储库转换为已转换的存储库,并使用splice map删除第一次提交,但我似乎无法使其工作。

我还尝试过使用不带拼接映射的转换来将当前Mercurial仓库中的所有变更集转换为转换后的版本,并将当前的第二个版本转换为旧SVN存储库中的最后一次提交但是我可以也没办法。

为了使这个更清楚,我可以说我有这两个存储库:

A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)

现在我想将这两者合并到包含以下内容的新存储库中:

C: revA1-revA2-revB2-revB3

2 个答案:

答案 0 :(得分:11)

只要您更改新版本的哈希值(您是),您也可以使用exportimport(或transplant命令。围绕两者的包装。)

你已经完成了你的转换,这很棒,现在进入回购B并做:

hg export -o 'changeset-%R.patch' 1:tip

将为repo B中的每个变更集创建一个变更集 - ##。补丁,除了第一个(编号为零)。

现在去回购C并导入它们:

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

如果revA2和revB1确实相同,那么应该干净利落。

答案 1 :(得分:0)

您可以使用“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

make repository a

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"