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

30

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

merge -squash

SVN中是否有相应的命令?我正在使用SVN 1.6版本。


4
服务器运行的 SVN 版本是哪个?1.5 及以上版本相对于 1.4 或更早版本对你的问题有很大的区别。 - William Leara
5个回答

43

从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

将所有更改整合成一个提交。 (此操作后,您应该删除分支)


"在此操作之后,您应该删除该分支"。为什么不应该只是说“可以删除”?只要不会引起任何问题,我喜欢保留所有历史记录。 - Zitrax
3
当运行 svn log -g 命令时,旧版本的历史记录仍然存在。但是你不应该再使用这个分支了,因为没有更多的簿记记录就无法再次合并了。(需要注意的是,较新版本的 Subversion(1.8+)已经取消了 --reintegrate 要求,并且可以通过正确地从主干进行合并来重新使用该分支) - Bert Huijben
假设创建了新的分支。 假设此后,新分支产生了提交 b1、b2 和 b3,主干产生了提交 t1、t2 和 t3。 在执行两阶段合并后,主干的 svn 日志是否会包含 b1、b2、b3、t1、t2 和 t3 的单独提交条目? - JohnC

6
要创建一个分支的合并,并为分支中的每个提交创建一个单独的提交,您可以使用一个脚本,我正在使用以下内容:
#/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

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

我刚刚成功地使用了这个脚本,它的效果很好。唯一需要考虑的是,由于此脚本循环遍历从X到N的所有修订号,它们不是纯连续的数字,例如我们可能有修订1131后跟着修订1135。在这种情况下,我们将合并一个空白修订提交到新分支中,创建一个没有更改的提交。下次我可能会修改这个脚本,检查tmps.commit是否为空,如果是,则“继续”以避免这些额外的无更改提交。由于SVN不允许没有注释的提交,因此这应该按预期工作。 - jcpennypincher
以上脚本的Windows版本,还添加了jcpennypincher设想的跳过空提交检查。 - zb226

5
我对合并操作有点生疏,但这应该能解决问题吧?
svn merge -rREV1:REV2 svn://server/branch my_trunk_wc

参见:

svn merge --help

1
只需将翻译的文本合并到您的工作副本中,然后提交即可。但主干历史记录将仅记住此提交 - 而不是来自分支的提交。 - Dmitry Yudakov
我觉得你是对的...我和“copy”混淆了,它可以保留历史记录。 - DarkDust
2
这不是 svn:mergeinfo 的作用吗? - detly
10
在使用Subversion 1.5或更高版本时,合并操作会被记录在本地工作副本的svn:mergeinfo属性中,因此这些信息不会丢失。如果您使用svn log -g而不是普通的svn log命令,则可以查看已经合并的修订版本。 - Bert Huijben
@Bert Huijben:我认为你给出了正确的答案。请将其作为答案,以便我可以给你奖励。谢谢。 - zs2020

1

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


5
那些工具有什么例子? - turbanoff

0

看起来你想要:

  1. 从可能的几个分支合并。
  2. 将所有合并正确记录为这样的。
  3. 仅提交一个新版本。

我认为这受到底层 SVN 架构的支持。但我不知道是否有任何客户端提供它(尽管 svnmucc 将为多个 cpmvrm 命令执行此操作)。除非你想做比我更多的研究(这不需要太多时间),或编写自己的客户端来驱动 SVN 库来执行它(这可能很难但仍然可行);那么我认为你将不得不牺牲上述 2 和 3 中的一个。

(如果你放弃了第三个,你可以立即转储存储库,并修改转储文件以仅使用一个版本,但我认为这不值得冒险,只是为了拥有稍微简单的修订历史...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接