Subversion 1.6.0和目录� �冲突
Filed Under (General, Subversion Client) by rocksun on 31-03-2009
Tagged Under : 1.6, tree conflicts
转载请注明本文地址:http://www.subversion.org.cn/submerged/?p=113
大多数Subversion用户熟悉文本的冲突,一个经典场景是� 在工作拷贝修改了一个文件,而svn update从版本库带来的变更也包含了这个文件的修改,而这两部分变更� 法干净的结合为一个本地变更,结果就是文本冲突。Subversion 1.6.0将此概念扩展倒了目录级别,例如,� 在本地� 除了一个文件,而更新会带来这个文件的文本变更时的情况,这种新的冲突被叫做目录� �冲突。
让我们看一个预期中目录� �冲突的简单例子,不过首先看一下在Subversion 1.5.6的老“方式”。
和文本冲突一� �,目录� �冲突会在更新、转移或合并(从技术上讲,检出时也会)时发生,在这个例子中,我们从trunk合并到trunk的一个分支上。
1.5.6
� 在我们的工作拷贝,我们有一个有文本修改的文件:
1.5.6> svn st M notes\obliterate\obliterate-functional-spec.txt
检查一下从trunk需要合并那些内容,我们得到了r36680:
1.5.6> svn mergeinfo --show-revs eligible %URL%/trunk . r36680
查看r36680的日志,我们看到Barry恰好将我们本地修改的文件改名:
1.5.6> svn log -v -r36680 %URL% ------------------------------------------------------------------------ r36680 | Barry | 2009-03-19 11:21:25 -0400 (Thu, 19 Mar 2009) | 1 line Changed paths: A /trunk/notes/obliterate/obliterate-func-spec.txt (from /trunk/notes/obliterate/obliterate-functional-spec.txt:36679) D /trunk/notes/obliterate/obliterate-functional-spec.txt
Just making a file name a bit shorter ------------------------------------------------------------------------
想到Subversion将重命名作为复制和� 除的组合执行,当我们合并r36680时,重命名的添� 部分会成功,但是� 除部分则由于� 除本地的修改而不能成功,Subversion通常会通知不能� 除未版本化的修改:
�
1.5.6> svn merge %URL%/trunk . -c36680 --- Merging r36680 into '.': A notes\obliterate\obliterate-func-spec.txt Skipped 'notes\obliterate\obliterate-functional-spec.txt'
当合并之后,留下了两个版本化的spec文件,Barry重命名的一部分以及我们的本地修改。我们可以以此提交,但是这不是我们希望的。在这个情况下获得正确的结果,也就是在改名的文件中包含我们的修改,� 为Subversion使用复制和� 除对待改名的情况,实现这个目� �需要多出许多环节。
首先,我们需要使用OS的复制命令复制修改的文件到新位置:
1.5.6> copy notes\obliterate\obliterate-functional-spec.txt notes\obliterate\obliterate-func-spec.txt Overwrite notes\obliterate\obliterate-func-spec.txt? (Yes/No/All): y 1 file(s) copied.
然后使用Subversion来恢复到 我们最初本地修改的文件:
1.5.6> svn revert notes\obliterate\obliterate-functional-spec.txt Reverted 'notes\obliterate\obliterate-functional-spec.txt'
现在允许我们� 除它:
作为选择,� 可以只使用–force选项� 除和组合最初的两步。诚然,这是一个坏� 惯,这� �会清除掉所有的本地修改。回想我们说Subversion会努力保留未版本化的本地修改,svn delete –force就是与revert子命令不同的一个例子,所以要小心。
1.5.6> svn del notes\obliterate\obliterate-functional-spec.txt D notes\obliterate\obliterate-functional-spec.txt
留下我们希望得到的东西,注意’notes\obliterate\obliterate-func-spec.txt’包含了我们最初的本地修改。
1.5.6> svn st M . D notes\obliterate\obliterate-functional-spec.txt A + notes\obliterate\obliterate-func-spec.txt
现在,在上面的例子中,很明显发生了什么。但是如果我们合并了� 百个修订和� 百个改变的路径?很容易错过这种“Skipped”的信息,提交合并。这些错误会在很久以后才能被发现。
1.6.0
现在,让我们看一下1.6.0中的目录� �冲突,给定同� �的分支工作拷贝:
1.6.0> svn st M notes\obliterate\obliterate-functional-spec.txt
我们执行相同的合并,注意最显著的改变,我们看到目录� �冲突,而不是跳过:
1.6.0> svn merge %URL%/trunk . -c36680 --- Merging r36680 into '.': A notes\obliterate\obliterate-func-spec.txt C notes\obliterate\obliterate-functional-spec.txt Summary of conflicts: Tree conflicts: 1
检查工作拷贝的状态,我们看到与1.5.6的第二项区别。重命名的额外部分会和以前一� �,但是会在’notes\obliterate\obliterate-functional-spec.txt’ (第7列的‘C’)报告目录� �冲突。此外,有一些目录� �冲突的本性,特别是合并时包含本地的修改和来自的� 除。
�
1.6.0> svn st M . M C notes\obliterate\obliterate-functional-spec.txt A + notes\obliterate\obliterate-func-spec.txt
让我们假定� 视目录� �冲突,直接提交。这是第三个变化,Subversion不会允许包含目录� �冲突的工作拷贝提交:
1.6.0> svn ci -m "I don't care what happened! Commit away" . svn: Commit failed (details follow): svn: Aborting commit: 'C:\SVN\1.6.0.WC\my_branch_WC\notes\obliterate\obliterate-functional-spec.txt' remains in conflict
为了提交这个合并,我们需要说出我们的决定。如果� 为一些原� 我们希望保留两个文件,我们可以直接解决冲突并提交变更。也有可能我们希望将变更应用到新文件,在这时我们可以解决这个冲突:
1.6.0> svn resolve --accept working -R . Resolved conflicted state of 'notes\obliterate\obliterate-functional-spec.txt'
1.6.0> svn st M . M notes\obliterate\obliterate-functional-spec.txt A + notes\obliterate\obliterate-func-spec.txt
下面的步骤和1.5.6时一� �。
注意:在1.6.0,–accept选项的svn resolve子命令对于目录� �冲突没有特殊处理。只要有目录� �冲突,结果相同,就像� 使用废弃的svn resolved命令。只有以前的文本冲突在对–accept选项有效。
应该注意到目录� �冲突的概念并不新鲜。� 可以在Subversion 1.6之前的任何版本遇到目录� �冲突,1.5.6的例子是一个“目录� �冲突”,只是它并没有有用的方式处理。 1.6.0的目录� �冲突特性主要关于识别出目录� �冲突,并在没有解决时将其保持在工作拷贝。
对于每个新特性,以后的发布都会有许多要做的事情。在这里,让命令行程序更简单的解决目录� �冲突就非常重要。如果� 是Collabnet Desktop的用户,� 很幸运。在桌面版的1.8版本,预计在2009年3月,会包含目录� �冲突解决特性。这个特性会完成冲突解决的许多脏活。前面的例子中,可以轻松的将修改从� ’obliterate-functional-spec.txt’ 合并到’obliterate-func-spec.txt’,只需要一个对话框。如果� 对1.6的目录� �冲突感兴趣,而没有使用Collabnet Desktop,可能是一个尝试的好机会。
我想问您一个问题
希望您能够在您在百忙之余丑一点时间为我解答一个问题,行吗?
我装好了svn,以及tortoisesvn,我用tortoisesvn提取文件或者是提交文件都会有错误提示(� 该说与服务器交互都会这� �子):期望文件系统� �式在“1”到“3”之间;发现� �式“4”
我想问下怎么回事?
真诚的希望您能够回答。
� 的版本库是什么版本,� 的服务器程序是什么版本的?
可能� 为版本库太新,程序太旧
我服务程序是1.5.3的
tortoisesvn是1.6的
是初学,用tortoisesvn建立了一个版本
然后用svnserve -d -r 启动服务 没有关掉
然后用tortoisesvn链接服务器 就会出现这个问题
也就是说库是新建立的了?
� 访问服务器的url是多少?
清确定� 创建版本库的svnadmin命令和svnserve的版本是一� �的
原来用的1.4的客户端,比较好用,就是随着版本数增� ,系统会很慢。
今天升级到1.6.1,发现合并后,解决冲突(Edit conflicts)� �本一点意义都没有,原来是做到版本间内容的比较,现在只是告诉� ,是想要本地的还是要库里的?我晕,这是bug呢还是功能太高级了,我不会用?
肯请解答,多谢了~
这是1.5就推出的交互式冲突解决,如果� 一直关注发布说明,就应该知道这个功能
这个功能是可以关闭的,各种客户端可能有自己的设置
谢谢~,已经找到相关文档
http://www.subversion.org.cn/?action-viewnews-itemid-33