如何在SVN中将分支与所有提交历史合并回主干?

如何在SVN中将分支与所有提交历史合并回主干?,svn,merge,Svn,Merge,如何在SVN中将分支与所有提交历史合并回主干?我知道在Git中我可以使用 merge -squash SVN中是否有任何等效命令?我使用的是SVN 1.6。您可以将每个变更集保存为差异,然后在主干上提交每个变更集。这通常被称为“移植”,有各种工具可以自动完成这项工作。我对合并有点生疏,但这不应该奏效吗 svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 见: 听起来你想: 可能从几个分支合并 正确记录所有合并情况 仅作为一个新修订提交

如何在SVN中将分支与所有提交历史合并回主干?我知道在Git中我可以使用

merge -squash

SVN中是否有任何等效命令?我使用的是SVN 1.6。

您可以将每个变更集保存为差异,然后在主干上提交每个变更集。这通常被称为“移植”,有各种工具可以自动完成这项工作。

我对合并有点生疏,但这不应该奏效吗

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc
见:


听起来你想:

  • 可能从几个分支合并
  • 正确记录所有合并情况
  • 仅作为一个新修订提交
  • 我认为这得到了底层SVN体系结构的支持。但是我不知道是否有任何客户机提供它(尽管svnmucc将为多个
    cp
    mv
    rm
    命令提供它)。除非你想做比我更多的研究(这不会花太多时间),或者编写你自己的客户机来驱动SVN库去做(这可能很难,但仍然可行);那么我想你必须牺牲其中一个。三,。上面


    (如果您牺牲了3个版本,您可以立即转储存储库,并对转储文件进行黑客攻击,使其仅使用一个版本,但我认为,仅仅拥有一个更简单的版本历史记录是不值得冒险的…

    对于Subversion 1.5或更高版本,合并将记录在本地工作副本的svn:mergeinfo属性中。因此,这些信息不会丢失

    如果使用
    svn log-g
    而不是正常的
    svn log
    ,则可以看到合并的修订

    正常合并按如下方式执行:

    svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 
    
    但如果使用分支,则有时使用合并更方便。在这种情况下,您应该首先使用以下方法将所有主干更改合并到分支

    svn merge svn://server/trunk my_branch_wc
    
    (这将合并尚未合并的所有内容)

    在您将此更改提交到分支之后,您可以使用

    svn merge --reintegrate svn://server/branch my_trunk_wc
    
    将所有更改作为单个提交进行移动。
    (此操作后,您应该删除分支)

    要创建分支的合并并为分支中的每个提交创建单个提交,您可以使用脚本,我使用以下命令:

    #/bin/bash
    
    BRANCH="http://your branch url"
    
    for i in {1127..1138} # list of revisions
    do
      REV=$i
      echo $REV $BRANCH
      echo merged $REV from $BRANCH > tmps.commit
      svn log -c $REV $BRANCH >> tmps.commit
      svn up
      svn merge -c $REV $BRANCH ./
      svn commit -F tmps.commit
      rm tmps.commit
    done
    

    这将签出您为特定分支指定的每个修订,并在当前目录上执行提交,从而将每个更改与相应的消息一起保留。

    它将合并到您的工作副本中,然后你会提交-但是主干历史只会记住这次提交-没有来自branchI的提交我认为你是对的。。。我混淆了保存历史的
    copy
    。这不是
    svn:mergeinfo
    的目的吗?对于Subversion 1.5或更高版本,合并将记录在本地工作副本的svn:mergeinfo属性中。因此,这些信息不会丢失。如果使用svn log-g而不是普通的svn log,您可以看到合并的修订版本。@Bert Huijben:我认为您给出了正确的答案。请回答我好让我给你赏金。谢谢。服务器上正在运行哪个版本的SVN?与1.4或更早版本相比,1.5及更高版本对您的问题产生了巨大的影响。我刚刚成功地使用了此脚本,并且它运行良好。唯一需要考虑的是,由于此脚本在从X到N的所有版本号上循环,它们不是纯粹的连续数字,例如,我们可能会在1131版之后再加上1135版。在这种情况下,我们将把一个空白的修订提交合并到新的分支中,创建一个提交而不做任何更改。下次我可能会修改此脚本,以检查tmps.commit是否为空,如果为空,则“继续”以避免这些额外的无更改提交。由于SVN不允许在没有注释的情况下提交,因此这应该可以按预期工作。它还添加了跳过空提交检查,如所设想的。任何该工具的示例:“在此操作之后,您应该删除分支”。为什么,不应该是“可以移除”吗?我喜欢保留所有的历史记录,只要它不会引起任何问题。历史记录仍然存在于旧版本中,正如您在运行
    svn log-g
    时看到的那样。但是您不应该再使用分支,因为如果没有更多的簿记,它将无法再次合并。(请注意,更新得多的Subversion版本(1.8+)放弃了--reintegrate要求,甚至可以通过从主干进行正确合并使分支再次可用)因此假设创建了新分支。假设在此之后,新分支产生提交b1、b2和b3,主干产生提交t1、t2和t3。执行两阶段合并后,trunk的svn日志是否会包含b1、b2、b3、t1、t2和t3的单独提交条目?
    #/bin/bash
    
    BRANCH="http://your branch url"
    
    for i in {1127..1138} # list of revisions
    do
      REV=$i
      echo $REV $BRANCH
      echo merged $REV from $BRANCH > tmps.commit
      svn log -c $REV $BRANCH >> tmps.commit
      svn up
      svn merge -c $REV $BRANCH ./
      svn commit -F tmps.commit
      rm tmps.commit
    done