【问题标题】:Subversion merging changes from a different repositorySubversion 合并来自不同存储库的更改
【发布时间】:2009-01-23 02:01:52
【问题描述】:

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

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

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

引用:

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

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

谁能帮我澄清一下,并提出最佳解决方案?

【问题讨论】:

    标签: svn


    【解决方案1】:

    我刚刚用 TortoiseSVN 做了一个简短的实验:

    创建测试存储库

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

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

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

    合并更改

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

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

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

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

    对于“to”版本,请选择您要应用的 HEAD 或最新更新。

    结果

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

    【讨论】:

    • 嗨,谢谢,我试过了,它似乎工作!我最近升级到 1.5,我只在 1.4 中尝试过它,然后我确定它不起作用。在阅读了这个blogs.open.collab.net/svn/2008/03/do-not-post-mer.html 之后,看起来他们在 1.5 中改变了一些东西。
    • 移动/重命名文件仍有一些小问题。 IE。如果您自定义了一个文件 rep2 并且该文件已移入 rep1,当它合并该修订版时,它似乎不会将您的自定义文件重命名为新名称,而是将其放入 rep1 中未修改文件的副本中,这很奇怪。
    • 我明白你的意思了,rename 命令实际上存储为删除旧文件和添加新文件(新文件的内容是从以前的版本复制的)。跨度>
    • 事实上,现在我想起来了,这同样适用于更新一个普通的单存储库工作副本。如果您修改了 text.txt 的本地副本,并且有人在存储库中将其重命名为 messages.txt,则更新您的工作副本将导致您的工作目录中有两个文件。
    • @Mike - 这是 svn_load_dirs.pl 脚本的重点。它有助于处理文件重命名和移动。我试图在我的回答中解释这一点。
    【解决方案2】:

    您提供的供应商分支链接确实有效地描述了您想要做什么的过程。这是一个完美的解决方案,允许您直接更新(导入)供应商分支,然后正如您所提到的,然后允许您将供应商的更新与您在主开发分支中的更改合并。

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

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

    【讨论】:

    【解决方案3】:

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

    svn 合并 ORIGINAL@REV UPGRADE@REV LOCAL_PATH

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多