Subversion合并来自不同存储库的更改

时间:2009-01-23 02:01:52

标签: svn

我真的很困惑。我想做一些事情a)看起来应该非常简单,而b)其他人必须一直做,但我无法找到在任何地方做到的最佳方式。

有一个包含一些第三方代码的外部存储库。我想获取代码版本1的副本并将其放在我自己的存储库中,然后根据自己的需要进行自定义。当该代码的第2版发布时,我希望能够使用所有版本2更改升级我的自定义版本,保留我的自定义。

我已经阅读了有关供应商分支(http://svnbook.red-bean.com/en/1.5/svn.advanced.vendorbr.html)但我不明白为什么合并供应商代码的先前副本和供应商代码的新副本需要如此复杂(即svn_load_dirs。 PL)。当然,如果第三方代码存储在SVN存储库中,那么关于哪些文件已被移动/被删除的所有历史记录都是已知的,那么为什么需要告诉它手动更改了什么?

引用:

  

例如,您将有机会告诉脚本您知道libcomplex版本1.0中的math.c文件已在libcomplex 1.1中重命名为arithmetic.c。

我还读过(http://svn.haxx.se/users/archive-2006-04/0285.shtml)可以简单地在不同的存储库之间运行合并,但我不认为这是可能的,每当我尝试它时它都失败了(尽管我本来可能做错了。)

有人可以为我澄清这一点,并提出最佳解决方案吗?

3 个答案:

答案 0 :(得分:20)

我刚刚尝试了TortoiseSVN的简短实验:

创建测试存储库

  1. 在rep1和rep2
  2. 中创建两个新存储库
  3. 查看rep1到co1
  4. 将文本文件添加到co1并在
  5. 中进行检查
  6. 将rep1导出到ex1
  7. 将ex1导入rep2
  8. 在此阶段,您将处于在新存储库中创建本地“分支”的状态。最后两个步骤是现有项目所需的全部步骤。

    要模拟原始仓库的某些更改,请修改co1中的文本文件并提交更改。

    合并更改

    现在,要创建自己的工作副本,请将rep2检入co2。

    我们应该准备尝试从rep1合并到co2。

    打开co2的合并对话框并将其指向rep1。

    对于“from”修订版,请选择导出副本的修订版(在本例中为修订版1),或上次更新本地副本的修订版。

    对于'to'修订版,请选择要应用的HEAD或最新更新。

    <强>结果

    这似乎按预期工作,rep1的修改应用于co2中rep2的工作副本。然后需要将它们提交回本地存储库。

答案 1 :(得分:9)

您提供的供应商分支链接确实有效地描述了您要执行的操作的过程。这是一个完美的解决方案,相对于允许您对供应商分支进行直接更新(导入),然后在您提到的情况下,将允许您将供应商的更新与主开发分支中的更改合并。

问题在于Subversion实际上并不直接支持文件重命名和文件之间的文件移动,以便从供应商代码中进行连续更新,因为您只是获取源文件内容的快照....将命令运行到版本系统中以指示对组成新版本的文件名树进行了哪些更改。这是svn_load_dirs.pl脚本进程的目的。它可以帮助您调整版本历史记录以匹配分支,以便您可以继续进行合并。如果供应商没有在您导入的版本之间重命名和/或移动文件,则不会出现此问题。

无论如何,这里描述的过程是您/需要做的。

答案 2 :(得分:0)

我自己没有尝试使用多个回购,但我不明白为什么你不能使用第二个链接的建议。

svn merge ORIGINAL @ REV UPGRADE @ REV LOCAL_PATH

这有效地告诉SVN在原始结帐和您想要的版本之间进行所有更改,并将它们应用到您的本地副本。

Protip:我总是使用显式修订并将merge命令包含在提交消息中,以便我可以轻松查看历史记录并了解如何重现或撤消更改。