Answers:
使用svn move将旧干线的内容移动到其他位置,然后将分支重命名为干线。
请注意,在svn中复制和移动就像文件操作一样。您可以使用它们来移动/复制存储库中的内容,并且这些更改也将进行版本控制。将“移动”视为“复制+删除”。
[编辑] Nilbus刚通知我,使用时将发生合并冲突svn move
。
我仍然认为这是正确的方法。它将引起冲突,但是如果您仔细合并,很可能不会丢失任何数据。如果那样困扰您,请使用更好的VCS,例如Mercurial或Git。
我同意使用svn move命令来实现此目标。
我知道这里的其他人认为这很不寻常,但是我喜欢这样做。当我有一个功能分支并准备将其与也已进行重大修改的主干合并时,我会将其合并到一个新分支,通常命名为<FeatureBranchName>-Merged
。然后,我解决冲突并测试合并的代码。完成此操作后,我将后备箱移动到标签文件夹,这样我就不会丢失任何东西。最后,我将我<FeatureBranchName>-Merged
移到后备箱。
此外,我更喜欢在移动时避免使用工作副本,这是命令示例:
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主干URL分支URL
在我的行李箱的工作副本上。
这不会尝试以历史方式应用更改(保持主干中的更改)。它只是在分支和分支之间“应用差异”。在未修改的文件中,这不会为您的用户造成任何冲突。但是,您将从分支中丢失历史信息,但是无论如何执行合并都会发生这种情况。
建议您通过资源库浏览器工具进行这些更改。
通过工作副本尝试大型删除+移动操作是杀死工作副本的一种好方法。如果您被迫使用工作副本,请在每次删除或移动操作后执行增量提交,并在每次提交后更新您的工作副本。
@Aaron Digulla和@kementeus解决方案是可行的。对于Subversion 1.4存储库,复制/移动操作会使将来迁移到其他存储库结构或拆分存储库变得困难。
我认为1.5的改进包括更好的移动/复制历史记录解析,因此对于1.5存储库而言,这可能不是问题。
对于1.4存储库,我建议使用svnadmin dump
和svndumpfilter
执行现有主干在其他地方的移动,然后以相同的机制将分支移动到主干。将两个转储文件加载到测试存储库中,进行验证,然后将其移至生产环境。
当然,在启动之前,请备份现有的存储库。
这样可以保留历史记录,而无需明确记录移动/复制,并且使将来的重组,保存历史记录变得更加容易。
编辑:根据要求,来自1.4 Red-Bean书中的1.4行为的文档,筛选存储库历史记录
另外,复制的路径会给您带来一些麻烦。Subversion支持存储库中的复制操作,该存储库中通过复制一些现有路径来创建新路径。在存储库生存期内的某个时候,您可能已经将文件或目录从
svndumpfilter
排除的某个位置复制到了它所包含的位置。为了使转储数据自给自足,svndumpfilter
需要仍然显示新路径的添加项(包括副本创建的任何文件的内容),而不必将添加项表示为来自过滤后的转储数据流中不存在的源副本。但是,由于Subversion存储库转储格式仅显示每个修订版本中进行了更改,因此复制源的内容可能不容易获得。如果您怀疑存储库中有此类副本,则可能需要重新考虑一组包含/排除的路径,也许还包括麻烦的复制操作来源的路径。
这适用于使用进行的迁移/重组svndumpfilter
。有时候,有些额外的工作现在可以在以后节省很多额外的工作,并且通过svndumpfilter
在以后的迁移/重组中保持易于使用的可用性,可以以相对较低的成本降低风险。
尽管上面的答案会起作用,但这不是最佳实践。最新的svn服务器和客户端轨道将为您合并。因此,svn知道您已将哪些修订合并到分支中以及从何处合并。在保持分支最新,然后将其合并回主干时,这很有帮助。
但是,无论您使用的是哪个版本的Subversion,都有一种最佳实践方法可以将分支中的更改恢复到主干。它在Subversion手册中概述:Subversion的版本控制,第4章。分支和合并,保持分支同步。