Subversion 1.5 - 解决冲突
Filed Under (Subversion Client, Subversion in the Enterprise) by rocksun on 23-07-2007
如果你是这个blog的常规读者,你一定不会怀疑我们会在今年的晚些时候发布Subversion 1.5,包含合并跟踪这个大特性。技术上讲,合并跟踪是一项很大的内部特性,唯一例外就是对于UI中合并过程的简化。实现这个特性导致我们花费大量时间认真考虑整个合并过程和随之而来的技术上不属于合并跟踪的改进,这让我们写下这篇blog,来描述Subversion 1.5是如何让解决冲突的更简单。
Subversion 1.5带来了两项对于解决冲突的改进,第一个是svn resolved增加新的–accept选项,你可以通过指定一个文件的版本来解决冲突,另一个特性是交互冲突解决。
svn resolved
当Subversion在一个文件生成冲突时,你需要做出一些动作来解决冲突,然后运行svn resolved命令告诉Subversion你做的事情,就像前面说的,这个命令现在包含了一个–accept选项,允许你在确定冲突已经解决的同时选择文件一个特定的版本,这个特性最常见的用法就是对付二进制文件。
一个我会使用这个特性的例子是当我有一个发布分支使用了与trunk不同版本的二进制文件,例如JAR文件,例如,我的分支也许使用某个库的1.x版本,而trunk使用2.x版本,当我将修改从trunk转移到分支时,会包含这个库的文件,我会在分支上得到冲突,如果没有这个命令,我需要在工作拷贝手工的拷贝/改名正确版本的文件,然后运行svn resolved命令,通过这个改进,我可以告诉Subversion这样做,例如:
svn resolved –accept=left my-library.jar
这样会代替branch中使用的文件来解决冲突,除了二进制文件,其他用户会在脚本中实现自动合并到某个分支类型,显然这个特性不是用来在你使用三方区别/合并工具用来解决冲突时使用,然而,下个特性就是解决这中场景。
交互式冲突解决
svn resolved特性的开发确实使得开发者思考这种特性是如何集成到合并过程本身的(顺便说一下:所有这些特性可以应用到update和switch命令,因为他们也会产生冲突),这导致了交互冲突解决特性的产生,下面是这个特性的例子:
svn up
U contrib/client-side/svnmerge/svnmerge_test.py
Conflict discovered in ‘contrib/client-side/svnmerge/svnmerge.py’.
Select: (p)ostpone, (d)iff, (e)dit, (h)elp : h
(p)ostpone - mark the conflict to be resolved later
(d)iff - show all changes made to merged file
(e)dit - change merged file in an editor
(r)esolved - accept merged version of file
(m)ine - accept my version of file
(t)heirs - accept repository’s version of file
(l)aunch - use third-party tool to resolve conflict
(h)elp - show this list
Select: (p)ostpone, (d)iff, (e)dit, (h)elp : t
G contrib/client-side/svnmerge/svnmerge.py
Updated to revision 25685.
在这个例子里,我运行了update命令,且得到了冲突,这是因为我本地修改了文件。这个update过程会提示我解决这个冲突,也提供了许多选项来辅助我。在这个例子里,我使用了(h)elp选项来显示更多的选购向,例如在svn resolved特性里,我可以选择某个文件的版本(对于二进制文件类型很有效),但是现在我也可以选择看一下diff,或者打开一个编辑器或甚至启动一个3方区别工具,后面的两个选项需要设置EDITOR或SVNMERGE的环境变量来启动相应的工具。
如果你采用这个选项来编辑文件,当你结束时,你可以告诉Subversion你已经解决了冲突,如果你只是希望Subversion将文件标记为conflicted,你也可以使用(p)ostpone选项,这样就可以在以后解决冲突,就像你现在的方式。
你有很多方法可以关闭这个特性,第一是添加–non-interactive选项,有这个选项时,Subversion会仅仅创建冲突,而不会在过程中提示你。对于自动脚本或你不希望提示时非常有用,你也可以通过运行配置文件关闭这个特性:
[miscellany]
interactive-conflicts = no
通过设置这个配置文件,你就从本质上回到1.5之前的行为方式。
结论
还有一点我没有谈到的是这Subversion的这些特性都有Subversion API,所以图形化客户端可以很容易的实现同样的特性,例如我们已经将交互冲突解决集成到了CollabNet Desktop - Eclipse Edition,随着Subversion 1.5版本发布日期的临近,我可能会在另一个帖子里介绍其他Subversion图形客户端的这个特性,类似的,我肯定TortoiseSVN会很快集成这些特性,做出伟大的事情来。
About the Author
Mark Phippard is Director, Subversion Engineering at CollabNet. He works on the CollabNet Subversion team and is a project owner for the Subclipse project as well as a partial committer for Subversion. Permalink