从分支到主干的“天真”svn合并?

14

我正在使用 TortoiseSVN 管理我的 C++ 项目,尝试将“分支重新整合”到主干。

我的情况相当简单,因此对于在分支中更改的每个文件,我希望它完全覆盖主干中匹配的文件。不幸的是,TortoiseSVN 比我聪明,因此它会合并每一对文件——导致一些不一致的代码。例如,在分支中已删除的某些代码行在合并后的版本中被恢复。

是否有办法强制 TortoiseSVN 使用简单的合并行为,并覆盖所有修改过的文件?

谢谢, 丹

5个回答

7

以下是如何仅使用SVN(无需在文件系统中操作)完成此操作的步骤:

  1. 检出你创建分支所在的主干版本(而不是 HEAD 版本)。
  2. 将其提交到代码库中(这将撤消所有后续的主干更改)。
  3. 进行重新集成合并(你的主干工作副本现在应与分支相同)。
  4. 提交合并后的主干,完成!

我认为那行不通。 重新整合合并本身就是个问题。据我所见,在第3步之后,主干工作副本可能与分支不完全相同-因为最终文件不仅仅是从分支获取的,它是主干文件和分支文件之间合并的结果。 - Danra
不是的,合并只会在共同祖先之后结合双方所做的更改。在这里,因为从您分支出去的那一点开始主干没有更改,所以应该可以正常工作。 - tzaman
第二步的命令是什么?如果我执行“svn commit”操作,因为svn认为没有任何更改,所以什么也不会发生。 - dan carter

0
  1. 更新分支到最新版本
  2. 将所有文件复制到您的工作站上的某个位置
  3. 切换分支到主干
  4. 使用常规的Windows资源管理器进行覆盖(只有更改过的文件会被覆盖)
  5. 提交

过于繁琐,而且容易在第4步中遗漏文件。(我将不得不有选择地复制文件,因为复制“所有”不是一个选项 - 例如,考虑.svn文件夹本身)。 - Danra
你可以使用TortoiseSVN中的“导出...”命令来导出不带.svn文件夹的分支。但是,如果您在分支中删除或重命名文件,则websen的过程将无法奏效。 - Jonas at Software Journey

0

webwesen的回答进行一些改进,因为我没有看到一个简单的方法:

  • 在某个目录中执行svn分支导出
  • 将该目录中的所有文件复制到主干目录中
  • 提交

嗯,我想那也行。最终我使用了类似的方法——使用Beyond Compare(http://www.scootersoftware.com/)的镜像功能来仅获取修改过的文件。不过,这是我期望TortoiseSVN具备的基本功能。至少我应该有一种简单的方式来查看错误的合并——TortoiseSVN的“重新整合分支”会将文件更新为已合并的副本,因此我甚至无法查看合并历史记录。 - Danra

0
据我所知,目前在svn中这是不可能的,因此TortoiseSVN无法帮助您。
简单地说一下(好吧,是非常简单),以svn update命令为例。如果您的工作副本和存储库都有修改,但实际上没有冲突,svn update将简单地将存储库的更改合并到您的工作副本中。
我认为没有办法绕过这个问题。如果您真的遇到了冲突,您可以使用--accept ACTION命令行选项仅保留本地更改(例如)。但是,如果您想为存储库和工作副本中的任何更改指定接受操作,则很遗憾,您将无能为力。
我想请教svn开发人员是否可以为此情况提供一个命令行选项,尽管这不会及时发布以帮助您。

我提到的冲突解决问题建议采用一个非常丑陋的黑客方式,我不建议这样做。使用您喜欢的工具获取分支中更改的文件列表。现在,对于该列表中的每个文件,在主干上修改它,通过在每行前面添加一个不寻常的字符来实现。将更改提交到主干。在重新集成之前合并以使分支保持最新状态,但使用--accept防止任何可怕的主干文件进入。然后,再次重新集成,使用--accept覆盖可怕的主干文件。

我应该补充说,您不能使用TortoiseSVN进行此操作,至少不是显而易见的,因为它不支持--accept,至少我没有找到。

好吧,我说过这很丑陋。不要在家里尝试这个!(我肯定没有。)


-2

"svn merge" 命令是为此目的而设计的,它将允许您在一步中合并。请参考这里的说明。


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