将我的项目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
答案 0 :(得分:11)
只要您更改新版本的哈希值(您是),您也可以使用export
和import
(或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"