将subversion存储库的一个分支作为新主干的最佳方法是什么?
对整个系统进行了重大改写:事物已被移动,重写,替换,删除,重命名等.重写的代码已经过测试并准备替换旧的主干.
基本上,旧主线(Trunk 5)被标记并将在此处结束.重写的分支(分支6)将成为新的主线(Trunk 7):
Trunk(1) --> Trunk(2) --> Trunk(5) --> × +--> new Trunk(7) \ \ | fork merge ??? \ \ | +--> Branch(3) --> Branch(4) --> Branch(6) --+
来自旧"主干"的所有持续变化已经包含在"重写分支"中
我怎样才能做到这一点?
使用svn move将旧主干的内容移动到其他位置,然后将分支重命名为trunk.
请注意,在svn中复制和移动的工作方式与文件操作类似.您可以使用它们在存储库中移动/复制内容,并且这些更改也会进行版本控制.将"移动"视为"复制+删除".
[编辑] Nilbus刚刚通知我你使用时会遇到合并冲突svn move
.
我仍然认为这是正确的做法.它会引起冲突但如果你仔细合并,很可能你不会丢失任何数据.如果这困扰你,请使用更好的VCS,如Mercurial或Git.
我同意使用svn move命令来实现这个目标.
我知道其他人认为这很不寻常,但我喜欢这样做.当我有一个功能分支并准备将它与一个也经过重大修改的主干合并时,我会将它合并到一个通常命名的新分支
.然后我解决冲突并测试合并的代码.一旦完成,我将主干移动到tags文件夹,这样我就不会丢失任何东西.最后我把我搬到
后备箱.
此外,我更喜欢在进行移动时避免使用工作副本,这里是命令的示例:
svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk
注意:我使用1.5
我最近只是在看这个问题,我非常满意的解决方案就是表现
svn merge --ignore-ancestry trunk-url branch-url
在我的行李箱的工作副本上.
这不会尝试以历史方式应用更改(维护主干中的更改).它只是在主干和分支之间"应用差异".这不会在未修改的文件中为您的用户创建任何冲突.但是,您将从分支中丢失您的历史信息,但无论如何您执行合并时都会发生这种情况.
建议您通过存储库浏览器工具进行这些更改.
通过工作副本尝试大型删除+移动操作是杀死工作副本的好方法.如果您被迫使用工作副本,请在每次删除或移动操作后执行增量提交,并在每次提交后更新工作副本.