一、 基本概念
版本库:服务器上的文件目录
工作拷贝: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提交合并后的代码
相关推荐
标题 "删除svn目录内.svn目录及内容的方法汇总" 涉及的是版本控制系统Subversion(简称SVN)的管理技巧。在使用SVN时,`.svn` 目录是Subversion存储元数据的地方,包括版本信息、工作副本状态等。然而,在某些情况下...
这有助于快速恢复到之前稳定的状态。 ### 10. 分支与标签 SVN支持分支和标签机制,用于实现特性开发和版本发布。创建分支可以隔离开发,不影响主线代码;创建标签则可以为特定版本创建快照,方便随时回溯。 总之...
### SVN(Subversion)常见错误及解决方案汇总 #### SVN服务配置错误:`svnserve.conf:12: Option expected` 在管理Subversion服务器时,你可能会遇到`svnserve.conf:12: Option expected`这样的错误信息。这通常...
### Linux 下 SVN 命令大全 #### 一、Checkout (检出) **命令格式**: ``` ...以上就是 Linux 环境下 SVN 的常见命令汇总,希望这些命令能够帮助你在日常开发工作中更加高效地进行版本控制管理。
此程序的核心功能是每天自动收集关于代码变更、锁定和其他相关活动的信息,并将这些统计结果汇总成报告,通过电子邮件的形式发送给所有SVN用户。下面我们将深入探讨该程序涉及的主要知识点。 1. **SVN(Subversion...
### SVN 官方中文版说明书知识点汇总 #### 一、Subversion概述 - **Subversion**(简称SVN)是一种集中式的版本控制系统,用于管理软件开发过程中的代码变更。 - **适用场景**:适合需要对代码进行版本控制的团队...
- **统计信息**:汇总提交次数、文件数量等。 - **离线方式**:在没有网络连接的情况下查看日志。 - **刷新视图**:更新显示的信息。 - **查看差异**: - **文件差异**:对比不同版本的文件内容。 - **行结束符...
- 有状态 Session Bean(Stateful Session Bean)在客户端首次调用时创建,并与客户端关联,后续调用会定向到相同的实例。 - **EntityBean**: - Entity Beans 的生命周期较长,状态持久化到数据库。即使容器...
- iOS的应用生命周期及其状态转换机制。 - 如何在Xcode中创建一个新的iOS项目,并理解项目的结构。 - 了解如何使用Storyboard或代码来构建用户界面。 - 掌握基本的UI组件(如UILabel、UIButton等)及其属性和...
这个"PB技巧大全汇总下载"显然是一份关于PowerBuilder使用技巧的综合文档,旨在帮助开发者提升在PB开发中的效率和代码质量。 文档《PB技巧大全.doc》可能涵盖以下关键知识点: 1. **PowerBuilder基础**:介绍PB的...
7. **已用空间统计**:`du -sh`用于查看指定目录(例如,目录名)的已使用空间大小,`-s`表示汇总目录下的所有文件大小,`-h`使输出更易读。 8. **终止进程**:`kill -9 进程号`命令强制结束指定进程号的进程。例如...
1. **日期和时间处理**: ...以上就是这份PHP面试题汇总中涵盖的知识点详解,涵盖了基础语法、数据库操作、字符串处理、面向对象编程、Web服务器交互等多个方面。理解和掌握这些知识点对于PHP开发者来说至关重要。
CVS、SVN(Subversion)和VSS(Visual SourceSafe)是常见的版本控制系统,用于追踪代码变更,协同开发。 8. **字符串翻转** PHP提供strrev()函数来反转字符串,如`echo strrev($a)`。 9. **MySQL数据库优化** ...
《.NET/C#软件工程师面试题目汇总》 在.NET/C#软件工程师的面试过程中,面试官通常会围绕以下几个核心领域来考察候选人的专业能力:基础知识、C#编程语言、.NET框架、数据库交互、设计模式与架构、软件工程实践以及...
与传统的集中式版本控制系统(如SVN)相比,Git赋予了开发者更多灵活性和控制力,特别是对团队外开发者贡献的代码进行审核,以及大部分操作可以离线完成,不需要联网。 Git的基本特点包括: 1. 本地操作:大部分Git...
### TortoiseSVN简明教程知识点汇总 #### 一、TortoiseSVN简介 - **定义**: TortoiseSVN是一款免费开源的Subversion版本控制系统的客户端工具,它能够帮助用户管理和追踪文件及目录的变化历史。 - **核心功能**: -...
- 调试器:用于检查代码运行时的状态,如 GDB、JTAG 探针等。 - 版本控制系统:Git、SVN 等,帮助团队协作和版本管理。 4. **嵌入式开发流程**: - 需求分析:明确项目目标、功能和性能指标。 - 硬件选型:根据...
事务确保了数据的一致性和完整性,即使其中一个操作失败,整个事务也会回滚,确保数据处于一致状态。 #### 四、PHP日期和时间处理 - **打印前一天的时间**: 使用PHP内置函数`date()`结合`strtotime()`可以轻松实现...