2010-08-20 123 views
23

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

merge -squash 

SVN中是否有等价的命令?我正在使用SVN 1.6。

+4

哪个版本的SVN在服务器上运行? 1.5和更高版本对1.4或更低版本的问题做出了巨大的改变。 – 2010-08-24 19:28:03

回答

35

在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 

将所有更改作为单个提交进行移动。 (此操作后,您应该删除分支)

+0

_“在此操作之后,您应该删除分支”_。为什么,它不应该只是“可以删除”吗?只要不引起任何问题,我都喜欢保留所有历史记录。 – Zitrax 2015-10-05 10:10:51

+1

运行'svn log -g'时,您可以看到旧版本中的历史记录仍然存在。但是你不应该再使用这个分支,因为如果没有更多的簿记,它就不能再被合并。 (请注意,更新的Subversion版本(1.8+)降低了--reintegrate要求,甚至可以使分支再次与正确的中继合并使用) – 2015-11-13 12:10:15

+0

@BertHuijben:您好,请您先看看我的问题[这里](http://stackoverflow.com/q/36157555/3287204)?在此先感谢... :) – 2016-03-24 16:25:49

1

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

+2

该工具的任何示例? – turbanoff 2015-01-21 13:17:47

5

我有点生疏与合并,但不应该这样做的伎俩?

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

参见:

svn merge --help 
+1

它只会合并到你的工作副本中,然后你会提交 - 但是树干历史记录只会记住这个提交 - 没有来自分支的那个 – 2010-08-20 15:29:59

+0

我认为你是对的......我混淆了'copy'这保留了历史。 – DarkDust 2010-08-20 16:28:45

+2

这不是什么'svn:mergeinfo'是为了什么? – detly 2010-08-24 02:53:15

0

这听起来像你想:多个可能的分支机构

  1. 合并。
  2. 将所有合并记录为正确。
  3. 只作为一个新版本提交。

我认为这是由底层的SVN架构支持的。但我不知道是否有客户提供它(尽管svnmucc会为它执行多个cp,mv,rm命令)。除非你想做比我更多的研究(这不会花费太多),或者编写你自己的客户端来驱动SVN库来完成它(这可能很难但仍然可行);那么我认为你将不得不牺牲上面2和3中的一个。

(如果你牺牲了3,你可以立即转储版本库,并且只需要修改一个版本就可以转储文件,但是我认为仅仅为了修改一个简单的修订版本就不值得冒险......)

1

要创建分支的合并,创建一个单一提交每个中,你可以使用脚本分支提交,我使用了以下内容:

#/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 

这将检查您为特定分支指定的每个修订版本,并对当前目录执行提交,从而保留每个更改与相应的消息。

+0

我刚刚成功地使用了此脚本,它确实很好。唯一的考虑是,由于该脚本在X到N之间循环了所有版本号,所以它们不是纯粹连续的数字,例如,我们可能有修订版1131,然后是修订版1135。在这种情况下,我们会将一个空白的修订提交合并到新分支中,创建一个没有更改的提交。我可能会在下次修改这个脚本来检查tmps.commit是否为空,如果是这样,请继续以避免这些额外的没有更改的提交。由于SVN不允许没有评论的提交,这应该按预期工作。 – jcpennypincher 2014-10-20 20:56:37

相关问题