【问题标题】:Adding changes from one Mercurial repository to another将更改从一个 Mercurial 存储库添加到另一个
【发布时间】:2010-04-21 16:27:08
【问题描述】:

在将我的项目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

【问题讨论】:

    标签: svn mercurial mercurial-convert


    【解决方案1】:

    只要您要更改新修订版的哈希值(您是),您不妨只使用exportimport(或transplant 命令,它是这两者的包装)。

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

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

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

    现在去 repo C 并导入它们:

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

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

    【讨论】:

    • 除了一件事之外,这非常有效。我似乎无法让导入与通配符一起使用,因此我必须为每个补丁文件进行一次导入,但无论如何我只需要这样做一次。谢谢!
    • 是的,通配符只能在你的 shell 进行全局扩展的 unix 上工作。在 Windows 上,每个应用程序都需要这种逻辑,所以如果你在 Windows 上,你需要一个 FOR 循环,或者像你一样运行每个应用程序。很高兴它成功了。
    • 它可能在 Linux 上也不起作用,原因很简单:变更集使用可变位数编号(即 1,2,3,...,10,11,...100,101等),导致changeset-10.patch按照正常的shell扩展在changeset-2.patch之前被导入。你应该对它们进行排序:hg import $(ls *.patch | sort -V)
    【解决方案2】:

    您可以使用“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 中。除非我忽略了什么。
    • 您将拥有来自两个存储库的所有修订版(包括副本),但它应该合并而不会发生冲突。与导出/导入解决方案相比,它会给您留下稍微混乱的修订历史记录。
    猜你喜欢
    • 2011-03-25
    • 2011-02-21
    • 1970-01-01
    • 2019-08-04
    • 2022-01-11
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多