今天在提交项目文件到本地SVN时提示错误以下: php
过时:”global.php“在事务”21-1“,
You have to update your working copy first. 服务器
运行update更新后再次提交又出现以下错误: 编辑器
svn: Commit failed (details follow): svn: Aborting commit: 'global.php' remains in conflict 查了一下SVN的手册才知道原来是多个版本之间遇到冲突。 此时你须要解决冲突(合并别人的修改)。举一个例子,Sally修改了sandwich.txt,Harry刚刚改变了他的本地拷贝中的这个文件而且提交到服务器,Sally在提交以前更新它的工做拷贝获得了冲突:
$ svn update C sandwich.txt Updated to revision 2. $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2 svn
在这种状况下,Subversion不会容许你提交sandwich.txt,直到你的三个临时文件被删掉。 工具
$ svn commit --message "Add a few more things" svn: Commit failed (details follow): svn: Aborting commit: '/home/sally/svn-work/sandwich.txt' remains in conflict spa
若是你遇到冲突,三件事你能够选择: 命令行
一旦你解决了冲突,你须要经过命令svn resolved让Subversion知道,这样就会删除三个临时文件,Subversion就不会认为这个文件是在冲突状态了。 日志
$ svn resolved sandwich.txt Resolved conflicted state of 'sandwich.txt' code
第一次尝试解决冲突让人感受很惧怕,但通过一点训练,它简单的像是骑着车子下坡。 事务
这里一个简单的例子,因为不良的交流,你和同事Sally,同时编辑了sandwich.txt。Sally提交了修改,当你准备更新你的版本,冲突发生了,咱们不得不去修改sandwich.txt来解决这个问题。首先,看一下这个文件:
$ cat sandwich.txt Top piece of bread Mayonnaise Lettuce Tomato Provolone <<<<<<< .mine Salami Mortadella Prosciutto ======= Sauerkraut Grilled Chicken >>>>>>> .r2 Creole Mustard Bottom piece of bread
小于号、等于号和大于号串是冲突标记,并非冲突的数据,你必定要肯定这些内容在下次提交以前获得删除,前两组标志中间的内容是你在冲突区所作的修改:
<<<<<<< .mine Salami Mortadella Prosciutto =======
后两组之间的是Sally提交的修改冲突:
======= Sauerkraut Grilled Chicken >>>>>>> .r2
一般你并不但愿只是删除冲突标志和Sally的修改—当她收到三明治时,会很是的吃惊。因此你应该走到她的办公室或是拿起电话告诉Sally,你没办法从从意大利熟食店获得想要的泡菜。一旦大家确认了提交内容后,修改文件而且删除冲突标志。
Top piece of bread Mayonnaise Lettuce Tomato Provolone Salami Mortadella Prosciutto Creole Mustard Bottom piece of bread
如今运行svn resolved,你已经准备好提交了:
$ svn resolved sandwich.txt $ svn commit -m "Go ahead and use my sandwich, discarding Sally's edits."
记住,若是你修改冲突时感到混乱,你能够参考subversion生成的三个文件—包括你未做更新的文件。你也可使用第三方的合并工具检验这三个文件。
若是你只是但愿取消你的修改,你能够仅仅拷贝Subversion为你生成的文件替换你的工做拷贝:
$ svn update C sandwich.txt Updated to revision 2. $ ls sandwich.* sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1 $ cp sandwich.txt.r2 sandwich.txt $ svn resolved sandwich.txt
若是你获得冲突,通过检查你决定取消本身的修改而且从新编辑,你能够恢复你的修改:
$ svn revert sandwich.txt Reverted 'sandwich.txt' $ ls sandwich.* sandwich.txt
注意,当你恢复一个冲突的文件时,不须要再运行svn resolved。
如今咱们准备好提交修改了,注意svn resolved不像咱们本章学过的其余命令同样须要参数,在任何你认为解决了冲突的时候,只须要当心运行svn resolved,—一旦删除了临时文件,Subversion会让你提交这文件,即便文件中还存在冲突标记。
最后!你的修改结束了,你合并了服务器上全部的修改,你准备好提交修改到版本库。
svn commit命令发送全部的修改到版本库,当你提交修改时,你须要提供一些描述修改的日志信息,你的信息会附到这个修订版本上,若是信息很简短,你能够在命令行中使用--message(-m)选项:
$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.
然而,若是你把写日志信息看成工做的一部分,你也许会但愿经过告诉Subversion一个文件名获得日志信息,使用--file选项:
$ svn commit --file logmsg Sending sandwich.txt Transmitting file data . Committed revision 4.
若是你没有指定--message或者--file选项,Subversion会自动地启动你最喜欢的编辑器来编辑日志信息。
版本库不知道也不关心你的修改做为一个总体是否有意义,它只检查是否有其余人修改了同一个文件,若是别人已经这样作了,你的整个提交会失败,而且提示你一个或多个文件已通过时了:
$ svn commit --message "Add another rule" Sending rules.txt svn: Commit failed (details follow): svn: Out of date: 'rules.txt' in transaction 'g'
此刻,你须要运行svn update来处理全部的合并和冲突,而后再尝试提交。
咱们已经覆盖了Subversion基本的工做周期,还有许多其它特性能够管理你得版本库和工做拷贝,可是只使用前面介绍的命令你就能够很轻松的工做了。