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

我很困惑。 我想要做的事情是:a)看起来应该很简单,b)其他人必须一直做,但是我无法find在任何地方做到最好的方法。

有一个包含一些第三方代码的外部存储库。 我想获取代码版本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 )可以简单地运行不同的仓库之间的合并,但我不认为这是可能的,而且每当我尝试过它都失败了(尽pipe我可能做错了什么)。

任何人都可以为我澄清这一点,并build议最好的解决办法?

谢谢,杰克

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

创buildtesting存储库

  1. 在rep1和rep2中创build两个新的存储库
  2. 检查rep1到co1
  3. 添加一个文本文件co1并签入
  4. 将rep1导出到ex1
  5. 将ex1导入rep2

在这个阶段,您将处于在新的存储库中创build本地“分支”的状态。 现有项目只需要最后两个步骤。

要模拟对原始回购的一些更改,请修改co1中的文本文件并提交更改。

合并更改

现在,要创build自己的工作副本,请检查rep2到co2。

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

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

对于“发件人”修订版,请select导出副本的版本(本例中为版本1),或者上次更新本地副本的版本。

对于“到”版本,请select您要应用的HEAD或最新更新。

结果

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

您提供的供应商分支链接确实有效地描述了您想要执行的操作。 相对于允许您直接更新(导入)供应商分支机构而言,这是一个完美的解决scheme,然后您可以将供应商的更新与主开发分支中的更改合并在一起。

问题是,Subversion实际上不提供直接支持文件重命名和目录之间的文件移动从供应商代码的连续更新,因为你只是获取源文件的内容快照….东西需要运行命令插入到版本系统中,以指示构成新版本的文件名称树所做的更改。 这是svn_load_dirs.pl脚本进程的目的。 它可以帮助你让你的版本历史被操纵来匹配分支,这样你就可以继续合并。 如果供应商没有在导入的版本之间重命名和/或移动文件,则不会出现此问题。

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

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

svn merge ORIGINAL @ REV UPGRADE @ REV LOCAL_PATH

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

Protip:我总是使用明确的修订版,并将合并命令与提交信息一起使用,以便我可以轻松查看历史logging并了解如何重现或撤消更改。