svn版本控制系统

一、svn简介

SVN是subversion的缩写,即版本控制系统,它是最流行的一个开放源代码的版本控制系统。作为一个开源的版本控制系统,Subversion管理着随时间改变的数据。这些数据放置在一个中央资料档案库(Repository)中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样就可以把档案恢复到旧的版本,或是浏览文件的变动历史。Subversion是一个通用的系统,可用来管理任何类型的文件,其中包括程序源码。

SVN采用客户端/服务器体系,项目的各种版本都存储在服务器上,程序开发人员首先将从服务器上获得一份项目的最新版本,并将其复制到本机,然后在此基础上每个开发人员可以在自己的客户端进行独立的开发工作,并且可以随时将新代码提交给服务器。当然也可以通过更新操作获取服务器上的最新代码,从而保持与其他开发者所使用版本的一致性。

SVN的客户端有两类,一类是基于Web的WebSVN等,另一类是以Tortoise SVN为代表的客户端软件。前者需要Web服务器的支持,后者需要用户在本地安装客户端,两种都有免费的开源软件供使用。

SVN存储版本数据也两种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。

二、版本控制

一个软件开发进行后,最关键的问题就是能够有效的实现软件版本的控制,而作为版本控制系统的核心任务,能否完成成功的查阅历史操作记录和实现协同开发才是公司研发团队关注的问题。版本控制(Version control)是项目开发与管理的标准做法,能追踪项目从开始到结束的整个过程,常被应用于软件程序开发。对编程人员而言,版本控制技术是团队协作开发的桥梁,有助于多人同步进行大型程序开发。由于在多人协作开发的模式下,每个人都向服务器提交自己的文件,就可能存在着代码被多次修改、替换的风险,但是版本控制能够在每次更新操作后进行相应的记录。一旦发生误操作,开发者能够根据服务器中的版本记录,将项目恢复到出现问题之前的其他版本。因此,借助版本控制技术,软件开发项目可以被分割为若干模块,每个模块并行地进行开发工作,从而有效地提高了整体编程效率。

版本控制技术对文件进行管理主要有两种模式:Lock-Modify-Unlock(锁-修改-解锁)和Copy-Modify-Merge(拷贝-修改-合并)。

在Lock-Modify-Unlock工作模式下,若用户想对某文件进行修改,必须先锁定该文件再进行修改,修改操作完成之后再对其解锁。这种文档管理模式能够有效避免多人对某文件同时进行修改而造成的冲突,但是它减少了用户并发操作。除此之外,该模式还有一个非常明显的缺点,即如果前面的用户完成修改后,忘了对文件进行解锁操作,则会导致后面想修改此文件的用户将永远处于等待解锁状态。采用这种管理模式的版本控制工具主要有Visual Source Safe(VSS)。

Copy-Modify-Merge工作模式下,当某一用户想修改文件时,可以先将服务器文件update到本地端,然后在本地端对副本进行修改,修改操作完成后,再将副本commit到服务器。如果在此用户commit之前,原文件已经被其他用户修改并提交过,那么服务器上的版本号与本地端上的版本号不同,二者将产生冲突,服务器将中止提交。此用户只有将服务器上的新版本update到本地端,将其与自己修改的文件进行合并,才能重新commit到服务器。在实际编程中,文件的合并过程一般需要编程人员共同协商决定。这种“拷贝-修改-合并”虽然需要花费一定的时间,但却比“锁-修改-解锁”等待的时间短,能够增加操作的并发度,大大提高团队的编程效率。

大多数版本控制系统采用的是第二种方式,如Concurrent Versions System(CVS)和Subversion(SVN),而这其中SVN是最为流行的版本控制软件,许多开源软件都采用了SVN作为源码版本控制服务器。在SVN版本控制软件的管理下,不管是在局域网还是在Internet上都可以对文件和目录进行管理,它突破了时间与空间的限制,促进了团队协作开发。

三、svn工作机制

SVN系统具体是如何实现对项目软件的版本控制呢?

一方面通过实现历史操作记录查阅。在任意一台服务器中都可以添加一个SVN版本库,而相应的版本库中存放大量的程序和文档,而这些项目资源主要通过配置管理员依据不同的配置管理计划对不同项目的组员分配与之相符合的访问权限,进而实现对资源的统一管理;只有被SVN标记为版本库中的资源,项目组成员才可以对版本资源库中的资源进行访问。一次简单的访问过程包括:相关项目组员首先在客户操作端建立一个从版本库检索出来的项目文件,而后就可以对拷贝的档案进行修改,最后通过SVN提文命令将其修改后的项目文件提交到终端服务器,终端服务器最终会对修改后的项目文件做最后的综合更新记录。修改过的文件在修改未被提交到服务器前,SVN服务器只会对已经提交到网络端服务器的项目文档进行更新审核,并与其他人的合并,在此之前修改过的文档是保密的,提交之后SVN网络端服务器会将修改后与修改之前的数据进行比较,并在后台对修改内容进行标注显示,进而实现对历史操作记录的更新记载。最终实现项目组组员既能检索出旧版本,又能通过SVN实现新旧版本的对比。

另一方面SVN通过进行组员间的协同开发实现对项目软件的版本控制。协同开发一般是指版本控制系统间接受并处理不同用户提交的各种不同性质的资源或源代码,同时允许各个用户之间在遵循相应规则范围内实现合作开发。如何处理好有矛盾的版本控制系统才是能够协同开发的关键,例如多个程序员同时对同一份资源代码进行修改、提交到SVN版本库,就有可能发生提交后的版本冲突等问题。

四、svn优势

1、存储

SVN服务器既具有CVS所具有数据储存的优点,例如信息资源存储后会形成资源树结构,便于存储的同时,数据一般不会丢失,同时又拥有自己的特色。SVN是通过关系数据库及二进制的存储方式,同时解决了既往不能同时读写同一文件等问题,又增添了自己特有的“零或一”原则。

2、速度

与人们初始的CVS相比,SVN在速度运行方面有很大提升。因为SVN服务器只支持少量的信息、资源传输,与其他系统相比,更支持的是离线模式,因此避免了网络拥挤现象的出现。

3、安全性

SVN是一种技术性更加安全的产品,实现了系统和控制两方面的结合。一方面可以将系统整体的安全功能有效地分布在分支系统中,进而保证分支系统能正常运行,从而使各分支系统能够互补,最终在系统整体性的安全性得以保障,通过均衡原则实现最终追求安全的目的。

五、svn版次

SVN使用“偶数/奇数”版次模式。
偶数编号的小数点版次(1.0、1.2等)被认为是稳定的版次。这样的版次只针对问题的修正才会变动,不会增加新功能,而且用户会期待使用的软件没问题。

相反地,奇数编号的小数点版次(1.1、1.3等)是开发(development)版本。在这样的版本中会增加新功能,它们倾向于快速的变更与变革,且有可能会有使得数据遗失的缺陷或问题。如果稳定性与数据保存性对你而言是重要的,则你应该使用偶数编号的版次。只有在它具有一个重要及必须要有的功能而且你愿意承担风险时,才使用奇数编号的版次。

六、SVN目录结构


目录介绍如下:
1.branches:分支开发目录。
2.tags:存档目录,用于保存比较完整版本标记。
3.trunk:主干目录,用于存储最新的稳定版本。
  3.1 Management:管理目录,用于存放与开发有关的管理文档。
    3.1.1 Plan:存放开发计划文档。
    3.1.2 Startup:启动目录,存放项目启动相关的文档,比如立项报告等。
    3.1.3 Meet:存放会议记录。
    3.1.4 Finish:用于存放项目结项相关文档,如结项报告,个人总结等。
    3.1.5 Log:存放开发日志。

  3.2 Engineering:工程目录,存放开发相关内容,如源代码和各类文档等。
    3.2.1 Requirement:存放开发文档。
    3.2.2 Design:存放原型设计界面图。
    3.2.3 Source:存放源代码。
    3.2.4 Test:存放测试文档,如测试用例等。
    3.2.5 Build:存放构建文件等。
    3.2.6 Deliver:存放交付文件等。

  3.3 Support:支撑目录,用于存放各种支持性文档。
    3.3.1 Training:培训目录,存放培训相关文档。
    3.3.2 Standard:存放一些开发标准,如编码规范等。
    3.3.3 FAQ:存放开发过程中的问题解答。
    3.3.4 Other:存放其他支持性的文档等。

七、总结

svn就是一个协同开发工具,即版本控制工具,能够记录软件开发的版本情况,方便多人开发和维护,主要的就是会使用即可,使用步骤:检索出版本-修改-更新-提交。在使用svn时一个主要的问题就是可能会遇到代码冲突的问题,能够进行解决代码冲突即可。

八、参考文章

(1) https://baike.baidu.com/item/SVN/3311103?fr=aladdin
(2) https://www.oschina.net/p/subversion?hmsr=aladdin1e1

原文地址:https://www.cnblogs.com/jasonboren/p/13091365.html