前言
SVN(Subversion)是一个自由开源的版本控制系统。当公司的开发团队在进行复杂的多项目开发时,SVN是最好的选择。
常见的源代码管理工具
- CVS
- 历史悠久,现在几乎没人使用
- SVN
- 集中式版本控制的代表
- CVS的接班人,速度比CVS快,功能比CVS强大
- 在国内使用率非常高(70%~90%)
- GIT
- 分布式源代码管理工具
- 目前被大多数开源项目使用
- 不过在国内企业尚未大规模普及
源代码管理工具出现的意义
- 目的
- 为了解决在软件开发过程中,由源代码引发的各种繁琐的问题
- 常见问题
- 无法后悔:做错了一个操作后,没有后悔药可以吃
- 版本备份:费空间、费时间
- 版本混乱:因版本备份过多造成混乱,难于找回正确的想要的版本
- 代码冲突:多人操作同一个文件(团队开发中的常见问题)
- 权限控制:无法对源代码进行精确的权限控制
- 追究责任:出现了严重的BUG,无法得知是谁干的,容易耍赖
- 作用
- 能追踪一个项目从诞生一直到定案的过程
- 记录一个项目的所有内容变化
- 方便地查阅特定版本的修订情况
SVN
- 原理
- 使用环境
- 要想利用SVN管理源代码,必须得有2套环境
- 服务器
- 用于存储客户端上传的源代码
- 可以在Windows上安装Visual SVN Server
- 大部分情况下,公司的开发人员不必亲自搭建SVN服务器
- 客户端
- 上传本地的源代码到服务器,或者更新服务器的代码到本地,保持同步
- 可以在Mac上使用命令行、Versions、Cornerstone、Xcode
- 开发人员就属于客户端这个角色
- 服务器
- 要想利用SVN管理源代码,必须得有2套环境
- SVN下载地址
安装
- 第一步
- 双击打开VisualSVN-Server-2.7.7.msi
- 第二步
- 同意遵守协议
- 第三步
- 选择Visual VSN 服务器和管理控制台, 和添加SVN命令行工具到系统Path路径, 然后下一步
- 第四步
- 选择版本
- 第五步
- 由于SVN都是在公司内网里使用,不存在数据被截取的安全问题
- 所以为了速度更快,不要使用https
- 取消勾选 Use secure connection(https://)
- 第六步
- 开始安装
- 第七步
- 安装完成后会询问你是否需要运行
- 第八步
- 安装成功打开软件
创建代码仓库
- 第一步
- 第二步
- 填写代码仓库的名称
- 第三步
-
仓库目录说明
- db目录:就是所有版本控制的数据存放文件。
- hooks目录:脚本文件的目录。
- locks目录:用放置hook来放置Subversion文件库锁定数据的目录,用来追踪存取文件库的客户端。
- format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号。
- conf目录:是这个仓库的配置文件(仓库的用户访问帐号、权限等)
第四步
添加用户
访问SVN服务器
- 本机直接访问
- 如果其他电脑想要访问仓库
- 要把仓库地址的前缀换成电脑的IP
对比Git
适用对象不同。 Git 适用于参与开源项目的开发者。 他们由于水平高,更在乎的是效率而不是易用性。Svn 则不同, 它适合普通的公司开发团队。使用起来更加容易。
使用的场合不同。 Git 适用于通过Internet,有多个开发角色的单个项目开发, Svn 适合企业内部由项目经理统一协调的多个并行项目的开发。
权限管理策略不同。 Git 没有严格的权限管理控制,只要有帐号,就可以导出、导入代码,甚至执行回退操作。 Svn 则有严格的权限管理, 可以按组、按个人进行针对某个子目录的权限控制。区分读、写权限。更严格的,不支持回退操作。保证代码永远可以追踪。
分支( branch )的使用范围不一样。 Git 中, 你只能针对整个仓库作 branch, 而且一旦删除,便无法恢复。而 svn 中, branch 可以针对任何子目录,它本质上是一个拷贝操作。 所以,可以建立非常多、层次性的 branch, 并且,在不需要时将其删除,而以后需要时只要 checkout 老的 svn 版本就可以了。
基于第三点, Git 适用于单纯的软件项目,典型的就是一些开源项目,比如 Linux 内核、 busybox 等。相反, Svn 擅长多项目管理。 比如,你可以在一个 svn 仓库中存放一个手机项目的 bsp/ 设计文档 / 文件系统/ 应用程序 / 自动化编译脚本, 或者在一个 svn 中存放 5 款手机项目的文件系统。 git 中必须建立 n ( 项目数 )* m (组件数) 个仓库。 Svn 中只需要最多 n 或者 m 个就可以了。
Git 使用 128 位 ID 作为版本号, 而且 checkout 时要注明是哪个 branch, 而 svn 使用一个递增的序列号作为全局唯一的版本号, 更加简明易懂。虽然可以使用 git tag 来建立一些文字化的别名,但是毕竟那只是针对特殊版本。
可跟踪性,git 的典型开发过程为: 建立分支,进行开发,提交到本地 master,删除分支。这样做的后果是以前 的修改 细节会丢失。 而在 svn 下做同样的事情,不会丢失任何细节。 这里是一个有趣的链接,表明了 git 下典型的工作方式:(以master为核心,不断创建新branch, 删除旧branch):
局部更新,局部还原。SVN由于是在每个文件夹建立一个.svn文件夹来实现管理,所以可以很简单实现局部更新或者还原。假如你只希望更新某些部分,则svn可以很好实现。同时代码写错了,同时可以很好实现局部还原,当然git也可以通过历史版本还原,但是无法简单地实现局部还原。
最后
养成使用源代码管理工具,会让我们的开发更加高效。