8

在将我的项目FakeItEasy的 VCS从 SVN 更改为 Google Code 上的 Mercurial 时,我有点太急切了(我很有趣)。我所做的只是从 SVN 中检查最新版本,然后将该检查提交为新 Mercurial 存储库的第一个修订版。这显然具有丢失所有历史的效果。

后来,当我对 Mercurial 有了更好的习惯时,我意识到有一个“转换扩展”之类的东西,它允许您将 SVN 存储库转换为 Mercurial 存储库。现在我想做的是转换旧的 SVN 存储库,然后将当前存在的 Mercurial 存储库中的所有更改集导入到这个转换后的存储库中,除了对 Mercurial 的第一次提交。

我已将 SVN 存储库转换为本地 Mercurial 存储库,但现在我遇到了困难。我想我可以使用转换扩展将当前的 Mercurial 存储库带入转换后的存储库,并使用拼接图删除第一个提交,但我似乎无法让它工作。

我还尝试仅使用不使用拼接图的转换将当前 Mercurial 存储库中的所有更改集转换为转换后的更改集,并将当前的第二个版本重新设置为旧 SVN 存储库的最后一次提交,但我无法得到那也可以工作。

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

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

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

C: revA1-revA2-revB2-revB3
4

2 回答 2

12

只要您要更改新修订版的哈希值(您是),您最好只使用exportand import(或作为transplant两者包装器的命令)。

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

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

这将为 repo B 中的每个变更集创建一个变更集-##.patch,但第一个变更集除外(编号为零)。

现在去 repo C 并导入它们:

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

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

于 2010-04-21T16:45:14.637 回答
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

使存储库成为

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"
于 2010-04-21T17:16:49.090 回答