关于svn:在Eclipse中进行Subversion合并的正确方法是什么?

关于svn:在Eclipse中进行Subversion合并的正确方法是什么?

What is the proper way to do a Subversion merge in Eclipse?

我已经很习惯于如何在Eclipse中进行CVS合并,否则,我对Subclipse和Subversive都可以与SVN存储库一起使用的方式感到满意,但是我不确定如何正确进行合并。

当我进行合并时,似乎想要将合并的文件粘贴在项目的单独目录中,而不是像在CVS中那样覆盖要在合并中替换的旧文件。

这个问题对于Subclipse或Subversive都不特定。

谢谢您的帮助!


将整个分支合并到主干

  • 检查分支项目的历史记录以确定分支的版本

    • 默认情况下,Eclipse团队"历史记录"仅显示过去的25个修订,因此您必须单击该视图中标记为"显示所有"的按钮
    • 当您说"全部显示"时,它将带您回到分支日期之后,并向您显示中继的所有历史记录,因此您必须在分支所在的位置搜索注释
    • 注意:如果您对同一任务使用Tortise SVN(导航至分支并选择"显示日志"),它将仅向您显示分支历史记录,因此您可以准确知道分支的开始位置
  • 所以现在我知道82517是分支历史记录的第一个版本ID。因此,超过82517的分支的所有版本都有要合并到主干的更改

  • 现在转到Eclipse工作区中的" trunk"项目,然后选择"右键单击-团队-合并"

  • 默认视图是1 url合并

    • 选择您要合并的分支的URL
    • 在修订下,选择"全部"
    • 按确定
  • 这将带您进入"团队同步"透视图(如果不是,则应自己去那里)以解决冲突(请参见下文)

  • 重新将更多分支更改合并到主干

  • 检查主干项目历史记录,以确定您上次合并到主干中的时间(您应该对此进行评论)

    • 为了争论起见,这个版本是82517
  • 所以现在我知道分支中任何大于82517的版本都需要合并到主干中

  • 现在转到Eclipse工作区中的" trunk"项目,然后选择"右键单击-团队-合并"

  • 默认视图是1 url合并

    • 选择您要合并的分支的URL
    • 在"修订"下,选择"修订"单选按钮,然后单击"浏览"
    • 这将打开最新的25个分支修订版本的列表
    • 选择数字大于82517的所有修订
    • 按OK(您应该在单选按钮旁边的输入字段中看到修订列表)
    • 按确定
  • 这将带您进入"团队同步"透视图(如果不是,则应自己去那里)以解决冲突(请参见下文)

  • 解决冲突

  • 您应该处于"团队同步"透视图。这看起来像用于提交目的的任何常规同步,在其中您可以看到新文件和有冲突的文件。

  • 对于您看到冲突的每个文件,请选择"右键单击-编辑冲突"(请勿双击该文件,它会显示commit diff版本工具,这是非常不同的)

    • 如果看到诸如" <<<<<<<。working"或"">>>>>>> .merge-right.r84513"之类的内容,则表示您的编辑模式错误
  • 解决该文件中的所有冲突后,告诉文件"标记为合并"

  • 一旦所有文件都没有冲突,您就可以同步Eclipse项目并将文件提交到SVN


  • 首先,如果您在Eclipse中查看文件时看到">>>>>"等,则可能意味着您没有使用适当的比较编辑器来查看文件。尝试在"项目"视图或"同步"视图中右键单击该文件,然后选择"编辑冲突"以打开一个比较编辑器,该编辑器将以图形方式而不是文本方式显示冲突区域。请注意,用于"编辑冲突"的比较编辑器与您在"同步"视图中双击一个文件时获得的比较编辑器不同– doublieclick比较编辑器显示了当前文件与其存在方式之间的差异上次签出或更新它时,"编辑冲突比较"对话框显示了两个更改源之间的差异(例如,合并的更改与合并之前工作空间中存在的更改)。

    其次,您可能希望了解某些版本的Eclipse颠覆性插件中的错误,该错误会导致所有接受合并更改的文件被错误地标记为存在冲突。该错误已得到修复,但是许多人似乎尚未更新以获取此修复程序。此处有更多详细信息:

    https://bugs.eclipse.org/bugs/show_bug.cgi?id=312585


    使用Eclipse集成,效果很好。

    CVS的主要变化是,您只能合并分支中的增量,即从一个修订版本更改为另一个修订版本。
    也就是说,您必须以某种方式跟踪正确的开始修订(除非您具有svn 1.5合并历史记录)

    如果您做对了,则取决于您如何使用比较编辑器来正确进行更改。


    我通常签出两个分支,然后使用"相互比较"选项对两个源树进行类似同步的比较。将更改集成到一个分支后,您可以重新提交到存储库。


    openCollabNet的子剪辑合并工具非常简洁。有许多可用的合并类型,而我刚刚无缝地进行了合并。我推荐它。


    请记住,使用svn将修改后的树恢复为干净状态非常容易。只需在合并目标分支上拥有一个干净的工作空间,然后运行merge命令从合并源分支中导入修改,然后同步工作空间,您将获得通常的日蚀比较窗口,其中显示了所有合并的修改文件和冲突。

    如果由于某种原因您不能解决冲突,则可以在项目上svn还原并返回到干净状态,否则就地进行合并,完成后就可以提交。请注意,您不必提交,完成冲突处理后,您还可以返回到开发视图,验证代码是否可以编译,运行单元测试等,然后再次进行同步并提交(一旦冲突在本地进行,解决他们不会回来了)

    上次查看时,使用subclipse merge命令时,它将覆盖合并的文件(使用冲突标记显示冲突区域),并将合并的原始左侧和右侧放置在同一位置。它不应将任何内容放在不同的目录中。

    根据经验,最好在单个提交中提交所有合并修改,并且仅在提交中包含合并修改,以便以后可以在需要时回滚合并。


    在Eclipse中同步视图缺乏的一件事是签入功能。在团队同步视图中,我可以查看所有更改并解决冲突,因此在此处签入而不是返回Java视图并签入将非常直观。


    我建议不要尝试使用Eclipse的插件作为对Subversion的主要访问方式。

    如果您在Windows上进行开发,那么TortoiseSVN是我所见过的Subversion访问的最佳程序。浏览到要合并的目录,右键单击该目录,然后使用Tortoise SVN合并选项。假设是非交互式合并,一旦遇到冲突,您将必须遍历每个冲突的文件并编辑冲突,然后再将其标记为已解决。对于此过程,我建议使用一个名为KDiff3的程序,该程序显示本地存储库副本(合并之前存储在.svn中的内容),本地副本(包括所有更改)以及来自存储库的副本,并允许您执行以下操作:轻松查看(甚至在需要时进行手动修改)合并的结果。它还会自动处理一堆小的冲突。

    KDiff3是可移植的,TortoiseSVN是Windows Shell扩展,因此,如果您使用的是其他环境,我将尝试仅使用SVN进行合并。但这会更痛苦:)


    我登陆这里是因为我正在寻找一种在外部合并编辑器(KDIFF3)中进行合并的方法,但是要从eclipse开始合并。我对上面提供的答案不满意。因此,这里是将kdiff3配置为Eclipse中SVN的合并和差异编辑器的方法:

    转到Windows->首选项→团队-> SVN-> Diff Viewer
    添加一个新的配置(添加按钮):
    扩展名或mimetype:*-如果您希望为不同的编辑者指定不同的mimetype,则不需要Alquantor。

    差异:
    程序路径C: Program Files KDiff3 kdiff3.exe(或任何具有合并编辑器的地方-尝试使用Windows路径,请随时在注释中添加Linux版本或编辑此答案。)

    参数:
    $ {base} $ {mine} $ {theirs}

    合并:
    程序路径C: Program Files KDiff3 kdiff3.exe

    参数:
    $ {base} $ {mine} $ {theirs} -o $ {merged}

    对于其他合并编辑器,这可能也可以正常工作,但是使用不同的参数语法(将其显示出来让我们知道:))。

    用法与合并视图一样(team-> edit冲突),而diff视图使用compare-> foo。

    干杯


    推荐阅读