01.SVN入门笔记——SVN 简介
开发中的实际问题
-
小 A 负责的模块就要完成了,然而硬盘出现故障,辛辛苦苦写的代码全都丢失了。——需求之一:备份!
-
这个项目中需要一个很复杂的功能,小 B 经过不断地摸索和尝试,终于有了思路了,但是此时的代码已经被改的面目全非了,自己改了哪里已经搞不清楚了。——需求之二:代码还原!
-
小 C 和小 D 先后从文件服务器上下载了同一个文件: Utils.java 。小 C 在 Utils.java 文件中的第 30 行声明了一个方法,叫 count(),先保存到了文件服务器上;小 D 在 Utils.java 文件中的第 30 行也声明了一个方法,叫 sum(),随后保存到了文件服务器上,于是 count() 方法就被覆盖了。——需求之三:协同修改!
-
老 E 是一位项目经理,他会把项目每一个版本都保存一份。一开始项目功能较少,没什么问题。但是随着时间推移,项目的功能越来越多,版本的迭代越来越频繁,而这些工程里其实有很多文件都是重复,浪费了大量的硬盘空间,不断添置新硬盘也增加了开发的成本。——需求之四:多版本项目文件管理!
-
老 F 是另一位项目经理,他管理的项目的功能越来越多,公司招聘的程序员也越来越多,老 F 也根本记不住哪个程序员负责哪个模块。每次要与开发某个模块的程序员进行沟通,老 F 都要花很多时间翻各种文档找到对应的程序员。为了追踪大家的开发进度,老 F 要求每个程序员完成开发工作后都要写一份文档,内容是自己改动了哪些代码,完成了什么工作。一开始版本更新慢,功能少,这么做还可以。然而随着版本的迭代越来越频繁,用这种方式记录的效率太低。而赶上项目 deadline 的时候,大家都忙的晕头转向,经常在文档中漏写或者写错自己改动过的代码文件,甚至有的人干脆就忘了写文档。而一旦项目出现问题,需要追溯代码的开发历史的时候,经常陷入一片混乱之中。——需求之五:追溯代码的编写人和编写历史!
-
小 G 是一名测试人员,他的工作就是在大家开发完成后对代码进行测试,小 G 只需要对代码有读权限就可以了,不需要有写权限。公司同时负责开发的项目很多,公司不希望项目组之间能看到其他项目组的代码,需要限制读写权限。——需求之六:权限控制!
版本控制简介
版本控制(Revision control),最初来源于工程设计领域,是维护工程蓝图的标准做法,能追踪工程蓝图从诞生一直到定案的过程。是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。
Subversion 就是一款实现版本控制的工具软件,通常也称为版本控制器,简称 SVN。 Subversion 是 Apache 软件基金会组织下的一个项目。
Subversion 的优良特性:
-
目录版本控制
CVS 只能追踪单个文件的历史,但是 Subversion 实现了一个“虚拟”文件系统,可以追踪整个目录树的修改,文件和目录都是版本控制的,结果就是可以在客户端对文件和目录执行移动和复制命令。
-
原子提交
提交要么完全进入版本库,要么一点都没有,这允许开发者以一个逻辑块提交修改。
-
版本控制的元数据
每个文件和目录都有一组附加的“属性”,你可以发明和保存任意的键值对,属性也会像文件内容一样被纳入版本控制。
-
可选的网络层
Subversion 在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制,Subversion 的“高级”服务器是 Apache 网络服务器的一个模块,使用 HTTP的变种协议 WebDAV/DeltaV 通讯,这给了 Subversion 在稳定性和交互性方面很大的好处,可以直接使用服务器的特性,例如认证、授权、传输压缩和版本库浏览等等。也有一个轻型的,单独运行的 Subversion 服务器,这个服务器使用自己的协议,可以轻松的用 SSH 封装。
-
一致的数据处理
Subversion 使用二进制文件差异算法展现文件的区别,对于文本(人类可读)和二进制(人类不可读)文件具备一致的操作方式,两种类型的文件都压缩存放在版本库中,差异在网络上双向传递。
-
高效的分支和标签
分支与标签的代价不与工程的大小成比例,Subversion 建立分支与标签时只是复制项目,使用了一种类似于硬链接的机制,因而这类操作通常只会花费很少并且相对固定的时间,以及很小的版本库空间。
SVN 的工作原理
采用 客户端 / 服务器 模式——在服务器的版本库中保存项目文 件的各个版本,所有参与协同开发的程序员在自己本地电脑上保存一个工作副本。
SVN 支持程序员将本地副本更新到服务器端的最新版本,也支持将本地副本的最新改变更新到服务器端,而且后面的更新不会覆盖前面的更新,而是作为一个新的版本被保存下来——SVN 甚至支持将本地工作副本恢复为服务器端保存的某一个历史版本。
SVN 基本操作
-
检出(checkout):将一个服务器端创建好的项目整个下载到本地,这是到项目组后参与开发的第一步,只需执行一次。
-
更新(update):将本地文件更新为服务器端的最新版本,通常为每天上班时或修改公共文件之前执行一次。
-
提交(commit):将本地修改提交到服务器端。通常每天下班前或每实现一个功能、完成一个模块时执行一次。