一、 基本概念
版本库:服务器上的文件目录
工作拷贝:svn co分支到你本地的文件夹目录
工作副本:co到本地的目录下的每个文件夹里的.svn文件夹。记录了"帮助 Subversion 识别哪些文件做过修改,哪些文件相对于别人的工作已经过期"的信息。
二、SVN版本比对原理
通过.svn与版本库比对。
".svn"文件夹下记录2个信息:
1、是当前用户co下分支的版本号,
2、是记录用户本地修改的最后时间戳。
通过以上2个信息,版本库能识别不同的状态,从而给予或限制用户做什么类型的操作。
当出现版本库中该分支已经有人提交代码(即版本库中该分支的版本更新),并且本地自己有修改,此时,如果用户提交,版本库先比较用户本地工作拷贝.svn中的版本和版本库版本,同时比较时间。她将需要用户先svn up,然后看看是否有冲突,没冲突再svn ci。
三、svn常用命令
以rate应用为例,实际说明操作。 1、svn cp svn cp http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100810_7368_2 http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV -m"xfc cp" 【注】:该动作已经由aone接手操作。 2、svn co(svn checkout) svn co http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV rate (【注】:自定义目录,本地目录) 3、svn st ! biz/remark/src/java/com/alibaba/china/rate/biz/remark/service/impl/RemarkServiceImpl.java D biz/remark/src/java/com/alibaba/china/rate/biz/remark/service/impl/RemarkTempServiceImpl.java ? biz/remark/src/java/com/alibaba/china/rate/biz/remark/util/MyTestUtil.java A biz/remark/src/java/com/alibaba/china/rate/biz/remark/util/MyTestUtil2.java X deploy/jboss_server M web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250274 ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.mine ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250702 C bundle/war/src/webroot/META-INF/autoconf/log4j.xml 【注】: "!"表示:本地执行了"rm -rf",但是未执行"svn del"的状态。 "?"表示:本地新加了一个文件,但是未执行"svn add"的状态。 "A"表示:本地新加了一个文件,且执行了"svn add"的状态。 "X"表示:执行了"svn external"的状态。 "D"表示:本地执行了"rm -rf",且执行了"svn del"的状态。 "M"表示:本地修改了该文件时的状态。 "C"表示:冲突状态,是重点关注状态之一。 产生的场景:A\B两个开发修改同一处代码,其中A开发已经提交,B开发在svn up的时候,就会出现conflict的提示,需要用解决冲突后,svn resolved下,具体见svn resolved。 4、svn up 【注】:当出现多个开发在同一个项目中开发同一个应用分支时,提交代码前都需要先做一次"svn up",保证合并最新代码,同时解决本地冲突。 5、svn info 【注】:一般用于获取当前分支url。 6、svn diff M web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java 【注】:以上这个""状态的文件,想看它相对你最新一次co的版本修改了那些,可以使用: svn diff web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java "-"是本地删除的行。 "+"是本地增加的行。 7、svn revert 【注】:当你发现某个你修改的文件你不想修改了,怎么办:svn revert。 svn revert web/remark/src/java/com/alibaba/china/rate/remark/web/action/ListsAction.java 然后svn st下,你会发现改文件M状态已经没了。 8、svn resovled 【注】:如上面3(svn st),当出现"svn up"下来的文件和本地的有冲突(即出现C状态)的时候,冲入如何解决呢? a,打开文件:vi bundle/war/src/webroot/META-INF/autoconf/log4j.xml b,你会发现有这么3个标识: <<<<<<< .mine ======= >>>>>>> .r250702 另外还有3个文件: ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250274 ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.mine ? bundle/war/src/webroot/META-INF/autoconf/log4j.xml.r250702 以上意思是:"<<<<<<< .mine"和"======="之间的是你本地添加到内容。"======="和">>>>>>> .r250702"部分的就是svn up下来的内容。 c,捞出修改这部分代码的开发,跟他一起确认如何解决冲突。 d,当确认了解决方案,解决了冲突,就删除类似以上那3个标识。 最后:svn resovled bundle/war/src/webroot/META-INF/autoconf/log4j.xml 冲突解决。你会发现上面的3个文件不翼而飞了。 9、svn ci 【注】:提交本地修改代码到服务器。 svn ci -m"modify remark log4j conf." 10、svn log 【注】:显示提交的日志信息 默认,显示该分支的所有相关版本提交日志。 如果只想显示自己打的分支,提交的日志情况,可以使用"—stop-on-copy"即可(stop前是2个"-")。 11、svn merge 【注】:合并分支。需要将老的修改合并到最新打出来的分支。 【注】:恢复旧版本。 当新打一条分支: svn cp http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/trunk http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2 -m"xfc cp" 现在要将老分支(http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV)的修改合并到新分支(http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2)上,步骤如下: (1)co下新分支。 svn co http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/trunk http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV2 ratenew (2)查看老分支提交日志。 svn log --stop-on-copy http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV ------------------------------------------------------------------------ r250702 | fangcheng.xiaofc | 2010-08-17 20:38:19 +0800 (二, 17 8月 2010) | 1 line xfc ci ------------------------------------------------------------------------ r250272 | fangcheng.xiaofc | 2010-08-17 10:14:33 +0800 (二, 17 8月 2010) | 1 line xfc cp 以上"r250272"版本是本分支最老的版本号,最新版本可用"HEAD"表示。 (3)合并老分支对应版本到新分支。 xfc@xfc:~/ratenew/20100817_xfc_DEV2$ svn merge --dry-run -r250272:HEAD http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV --- Merging r250273 through r250724 into '.': U bundle/war/src/webroot/META-INF/autoconf/log4j.xml "--dry-run"是假合并,并没有真正合并分支修改到新分支,如果要真做,删除该参数。 恢复旧版本,只要把版本次序倒过来: svn merge HEAD :-r250272 http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV svn merge的原理是比对版本差异,然后把差异的内容应用、合并到本地工作拷贝中。高版本:低版本,相当于"相对于高版本,低版本删除或者修改了那些内容"。
四、乌龟的使用
乌龟通常方便用于svn ignore和svn external这2个属性的设置上。
右键点击"deploy"的"show properties"可以查看到:
点击"new","edit"可以新增,修改svn属性。
/********************************************************************************/
/*
*
*/
/********************************************************************************/
SVN使用规范
1.提交必须写注释
清晰的提交注释有助于别人理解你所做的修改,出现问题时能够快速定位,也有助于项目经理把握开发进度。所以,在提交代码时,要填写明晰的标注,能够概要的描述所提交文件的信息,让项目组其他成员在看到标注后不用详细看代码就能了解你所做的修改。
2.禁止提交未编译通过的代码
代码在提交之前,首先要确认自己能够在本地编译,保证主干永远是畅通的。如果引用了新的类库,确保相应的pom.xml文件也已提交。
- 单元测试通过
- 应用启动正常
3.不要提交自己不明白的代码
代码在提交入SVN之后,你的代码将被项目成员所分享。如果提交了你不明白的代码,你看不懂,别人也看不懂,如果在以后出现了问题将会成为项目质量的隐患。因此在引入任何第三方代码之前,确保你对这个代码有一个很清晰的了解。
4.不要提交本地自动生成文件
eclipse会自动生成一些工程文件如.classpath,.settings等文件,以及项目编译生成的临时文件target, .class等等。提交了这样的文件后,别人在更新后就可能与本地的环境冲突从而影响大家的工作。通常在新建项目或模块时会设置相关的ignore属性,具体设置方法详见设置ignore,external属性
5.按功能模块整体提交,提交不要过于频繁
完成一个功能模块后,将该模块相关修改作为整体提交。不宜分离过于频繁提交,使功能上不同步,并无限增大svn版本号
6.提交后svn st检查是否有遗漏
提交后svn st检查下是否有冲突,有遗漏的代码
7.尽量使用命令提交
eclipse中的svn插件很便捷,但有时会存在漏提交,或多提交的问题,如总控的pom.xml在eclipse中看不到,易造成漏提交,尽量使用svn命令来提交。
- 命令会用了,原理就知道了
8.慎用锁定功能
在项目中要慎用锁定的功能,在你锁定了一个文件之后别人就无法继续修改提交该文件,虽然可以减少冲突的发生率,但是可能会影响项目组中其他人员的工作。平时只有在编辑那些无法合并的文件(例如图片文件,flash文件等)时,才适当的采用锁定操作。
- 如果你的需求开发跨度很大,建议每周合并一次主干
SVN使用技巧
常用命令
1.svn co [svn地址] [本地目录]:签出工作拷贝
svn co http://svn.alibaba-inc.com/repos/ali_cn/olps/rate/branches/20100817_xfc_DEV rate (【注】:自定义目录,本地目录)
2.svn st:查看工作拷贝状态
svn st X bundle/rpm/framework M quickconfig.sh X deploy/jboss_server 每行首字母的含义: "!"表示:本地执行了"rm -rf",但是未执行"svn del"的状态。 "?"表示:本地新加了一个文件,但是未执行"svn add"的状态。 "A"表示:本地新加了一个文件,且执行了"svn add"的状态。 "X"表示:执行了"svn external"的状态。 "D"表示:本地执行了"rm -rf",且执行了"svn del"的状态。 "M"表示:本地修改了该文件时的状态。 "C"表示:冲突状态,是重点关注状态之一。
3.svn diff:比较两个版本拷贝的区别
比较本地文件与与拷贝版本的区别
svn diff web/com/alibaba/china/app/levit/expo/web/action/DeclareAction.java
结果中行首字母"-"表示本地版本,"+"表示工作拷贝版本
4.svn info:查看工作拷贝信息
通常用来查看当前拷贝的svn地址
5.svn revert:取消本地所做修改
$svn revert quickconfig.sh Reverted 'quickconfig.sh'
6.svn log:查看提交日志信息
7.svn add:添加一个文件
8.svn cleanup:递归清理工作拷贝
9.svn ci: 提交工作拷贝
svn ci quickconfig.sh -m "标注"
10.svn update:更新本地拷贝
遇到工作拷贝已锁定的错误时,可以用该命令清除
11.最重要的------svn help:查看帮助
更多常用命令参见肖芳城【技术】svn命令小集
设置ignore,external属性
windows下使用乌龟设置的方法参见肖芳城【技术】svn命令小集#四、乌龟的使用
1.linux下命令方式
例:设置expo目录的ignore属性,忽略target, class, .classpath, .settings, .project
步骤:
1.svn propedit svn:ignore expo
2.这是出现一个vi编辑框,在里面加入要忽略的目录文件:
target
class
.classpath
.settings
.project
3.保存退出,会显示xxx的ignore属性被设置。可以用svn st查看那下效果。
2.eclipse插件方式
安装过subeclipse插件的可以通过插件设置属性
1.再需要设置的目录上右键->Team->Set Property
2.在弹出的对话框中设置属性
3.如果已经设置过相关属性,要做修改,可以在Team->Show Property中进行编辑
分支合并
1.创建新分支(现在该步骤在aone上完成)
svn cp 主干地址 新分支地址 -m "标注"
2.签出新分支
svn co 新分支地址 本地目录
3.检查旧版本版本号,在旧版本目录下执行
svn log --stop-on-copy
找到创建该旧分支时的版本号xxxx,通常是最小的那个
4.进入到新分支目录下执行合并操作
svn merge -r xxxx:HEAD 旧分支地址
5.使用svn st查看合并后的状态,查看是否存在冲突
6.冲突解决后,别忘了svn ci提交合并后的代码