Visual studio 对树结构进行彻底更改后,将分支重新整合回主干

Visual studio 对树结构进行彻底更改后,将分支重新整合回主干,visual-studio,svn,tortoisesvn,ankhsvn,tree-conflict,Visual Studio,Svn,Tortoisesvn,Ankhsvn,Tree Conflict,在我开始之前,有一个简短的说明:有很多解释需要“设置阶段”,这似乎更像是一个设计问题,而不是一个编程问题。这个问题实际上是关于SVN分支和合并的,所以请读到最后 脚本: 我有一个大型的VisualStudio解决方案,其中包含很多项目。我使用的是SVN,所以主干当然有我的开发生产线。这包括一个核心DLL程序集、“主”UI用户客户端和一些“插件”程序集,这些程序集通过在核心程序集上实现接口来操作,以便在UI中提供功能,还通过使用一组服务方法来为所有插件提供公共功能(例如持久性逻辑操作、集中式文件存

在我开始之前,有一个简短的说明:有很多解释需要“设置阶段”,这似乎更像是一个设计问题,而不是一个编程问题。这个问题实际上是关于SVN分支和合并的,所以请读到最后

脚本: 我有一个大型的VisualStudio解决方案,其中包含很多项目。我使用的是SVN,所以主干当然有我的开发生产线。这包括一个核心DLL程序集、“主”UI用户客户端和一些“插件”程序集,这些程序集通过在核心程序集上实现接口来操作,以便在UI中提供功能,还通过使用一组服务方法来为所有插件提供公共功能(例如持久性逻辑操作、集中式文件存储体系结构的存储操作等)

还有一些随着时间的推移我建立的外部实用程序,它们必须复制插件中的许多业务逻辑。我不会详细介绍,因为它最终会分散我的主要问题,但只描述一下,例如,服务器上的一个计划服务,该服务处理与某个部分相关的集中维护操作用户的数据

当我最初构建这个应用程序时,我(愚蠢地)没有预料到对集中服务层的需求,所以我构建了核心组件(无论好坏),如上所示,与应用程序的表示层紧密集成。换句话说,将插件与用户界面集成所需的UI表示逻辑以及插件执行常见插件逻辑操作所需的业务逻辑都是一个“核心”组件的一部分。因此,大部分“共享”组件插件和集中式服务之间存在的逻辑导致了代码重复

我决定进行主要的重构活动,将公共逻辑——与表示无关的逻辑——拉到一个“共享”程序集中。为此,我在主干上创建了一个分支。我将公共代码重新组织到一个“共享”程序集中,并重新指出客户端应用程序中的所有内容(插件等)在许多情况下,我还必须重命名类,以适应它们未来更广泛的用途。核心程序集仍然存在,只是为了代理插件和UI之间的表示层职责

问题: 现在我已经成功地完成了重构,我想将分支重新集成到主干中。即使在简单的情况下,合并也是一件棘手的事情,但我在这里要面对的是大量的树冲突。另外,除了驻留在一个全新的项目中,“共享”中的文件夹结构项目与“核心”项目有很大不同。在许多情况下,由于使用共享程序集的新机制,类位于不同的位置

我想维护每个类的版本历史,从它在核心程序集中的旧家到它在共享程序集中的新家。此外,我想保证合并是成功的。这似乎很明显,但在测试整个场景的一个微型版本时,我从未能够以这样的方式解决冲突:我的分支功能仍然完好无损。此外,正如我前面所说的,我已经重命名了一些类,以适应它们更一般的角色,这使得维护版本历史非常困难

我会注意到,当你重命名文件以修复移动时,我正在使用它在“正常”情况下很有帮助,但在这些主要的树冲突情况下,它似乎不起作用。此外,我知道不同版本的SVN之间合并的工作方式存在差异——我相信它是SVN 1.5之前和SVN 1.5之后的版本。我正在使用SVN 1.9.3

几周来,我一直在努力解决这个问题。我一直在浏览,从谷歌搜索中可以找到的任何东西,比如,和——在很多很多其他的搜索中。我觉得我快疯了,我觉得高级SVN(和乌龟)用传统的自学、从网络和书籍中学习的方法是不可能学习的。无论如何,我非常感谢任何有见解的人


当您使用SVN创建功能分支并计划进行主要树更改和“移动”(即重命名)时,正确的方法是什么?这样您就可以在不丢失任何东西的情况下将这些更改与主干重新集成?

祝贺您踏上SVN中最“流行”的rake—“重构后合并地狱”

对于你的案例,有(至少)两条简单的规则,由痛苦的经历产生:

  • 永远不要在SVN中执行重构
  • 如果您忽略规则1:以世界上所有神圣和美好的事物的名义,在branch中重构期间,不要触摸主干中的任何东西
  • 如果你拒绝这些公义的盟约,你仍然有得救的途径

    纯SVN方式,长而脏 合并所有和每个子树,这是树冲突的根源,手动确定每个源和目标

    svn merge NEW_PATH/NEW_NAME old_path/old_name
    
    通过完全合并完成这项血腥的工作

    诡计多端的易变方式(或Git方式,但我只是讨厌Git) 前言:对于现代DVCSE来说,此类合并根本不是问题,它们与SVN回购有“桥梁”,因此-您可以将合并工作委托给选择的外部VCS,并返回结果(带有一些限制和警告)

    我懒得谈论所有的DVCSE,只解释Mercurial(考虑到有了SVN背景,这将是最不痛苦的迁移)

    有了HGSubversion,Mercurial可以读(拉)和写(推)到Subversion存储库,但是-它不能推到Subversion res