一,svn的介绍php
Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变更。 这样你就能够把档案恢复到旧的版本, 或是浏览文件的变更历史。html
二,svn的概念程序员
平常开发过程其实就是这样的(假设你已经Checkout而且已经工做了几天):Update(得到最新的代码) -->做出本身的修改并调试成功 --> Commit(你们就能够看到你的修改了) 。算法
若是两个程序员同时修改了同一个文件呢, SVN能够合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。若是是同一行,SVN会提示文件Confict, 冲突,须要手动确认。数据库
三,svn的主要功能服务器
CVS 只能跟踪单个文件的历史, 不过 Subversion 实做了一个 "虚拟" 的版本控管文件系统, 可以依时间跟踪整个目录的变更。 目录和文件都能进行版本控制。网络
自从CVS限制了文件的版本记录,CVS并不支持那些可能发生在文件上,但会影响所在目录内容的操做,如同复制和重命名。除此以外,在CVS里你不能用拥有一样名字可是没有继承老版本历史或者根本没有关系的文件替换一个已经归入系统的文件。在Subversion中,你能够增长(add)、删除(delete)、复制(copy)和重命名(rename),不管是文件仍是目录。全部的新加的文件都从一个新的、干净的版本开始。dom
一个提交动做,不是所有更新到了档案库中,就是彻底不更新。这容许开发人员以逻辑区间创建并提交变更,以防止当部分提交成功时出现的问题。ssh
每个文件与目录都附有一組属性关键字并和属性值相关联。你能够建立, 并儲存任何你想要的Key/Value对。 属性是随着时间来做版本控管的,就像文件內容同样。svn
Subversion 有抽象的档案库存取概念, 可让人很容易地实做新的网络机制。 Subversion 能够做为一个扩展模块嵌入到Apache HTTP 服务器中。这个为Subversion提供了很是先进的稳定性和协同工做能力,除此以外还提供了许多重要功能: 举例来讲, 有身份认证, 受权, 在线压缩, 以及文件库浏览等等。还有一个轻量级的独立Subversion服务器, 使用的是自定义的通讯协议, 能够很容易地经过 ssh 以 tunnel 方式使用。
Subversion 使用二进制差别算法来异表示文件的差别, 它对文字(人类可理解的)与二进制文件(人类没法理解的) 两类的文件都一视同仁。 这两类的文件都一样地以压缩形式储存在档案库中, 并且文件差别是以两个方向在网络上传输的。
在分支与标签上的消耗并没必要必定要与项目大小成正比。 Subversion 创建分支与标签的方法, 就只是复制该项目, 使用的方法就相似于硬链接(hard-link)。 因此这些操做只会花费很小, 并且是固定的时间。
Subversion没有任何的历史包袱; 它主要是一群共用的 C 程序库, 具备定义完善的API。这使得 Subversion 便于维护, 而且可被其它应用程序与程序语言使用。
四,svn的好处
一、原子提交。一次提交不论是单个仍是多个文件,都是做为一个总体提交的。在这当中发生的意外例如传输中断,不会引发数据库的不完整和数据损坏。
二、重命名、复制、删除文件等动做都保存在版本历史记录当中。
三、对于二进制文件,使用了节省空间的保存方法。(简单的理解,就是只保存和上一版本不一样之处)
四、目录也有版本历史。整个目录树能够被移动或者复制,操做很简单,并且可以保留所有版本记录。
五、分支的开销很是小。
六、优化过的数据库访问,使得一些操做没必要访问数据库就能够作到。这样减小了不少没必要要的和数据库主机之间的网络流量。
五,svn的基本使用方法
安装:http://www.runoob.com/svn/svn-install.html
一、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
二、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下全部的php文件)
三、将改动的文件提交到版本库
svn commit -m "LogMessage" [-N] [--no-unlock] PATH(若是选择了保持锁,就使用--no-unlock开关)
例如:svn commit -m "add test file for my test" test.php
简写:svn ci
四、加锁/解锁
svn lock -m "LockMessage" [--force] PATH
例如:svn lock -m "lock test file" test.php
svn unlock PATH
五、更新到某个版本
svn update -r m path
例如:
svn update若是后面没有目录,默认将当前目录以及子目录下的全部文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。若是在提交的时候提示过时的话,是由于冲突,须要先update,修改文件,而后清除svn resolved,最后再提交commit)
简写:svn up
六、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预约加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工做版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的状况下也能够执行的,缘由是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
七、删除文件
svn delete path -m "delete test fle"
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m "delete test file"
或者直接svn delete test.php 而后再svn ci -m 'delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
八、查看日志
svn log path
例如:svn log test.php 显示这个文件的全部修改记录,及其版本号的变化
九、查看文件详细信息
svn info path
例如:svn info test.php
十、比较差别
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差别)
例如:svn diff -r 200:201 test.php
简写:svn di
十一、将两个版本之间的差别合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差别合并到当前文件,可是通常都会产生冲突,须要处理一下)
十二、SVN 帮助
svn help
svn help ci
1三、版本库下的文件和目录列表
svn list path
显示path目录下的全部属于版本库的文件和目录
简写:svn ls
1四、建立归入版本控制下的新目录 svn mkdir: 建立归入版本控制下的新目录。 用法: 一、mkdir PATH... 二、mkdir URL... 1五、恢复本地修改 svn revert: 恢复原始未改变的工做副本文件 (恢复大部份的本地修改)。revert: 用法: revert PATH... 注意: 本子命令不会存取网络,而且会解除冲突的情况。可是它不会恢复 被删除的目录 1六、代码库URL变动 svn switch (sw): 更新工做副本至不一样的URL。 用法: 一、switch URL [PATH] 二、switch --relocate FROM TO [PATH...] 一、更新你的工做副本,映射到一个新的URL,其行为跟“svn update”很像,也会将 服务器上文件与本地文件合并。这是将工做副本对应到同一仓库中某个分支或者标记的 方法。 二、改写工做副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变更 (好比方案名或是主机名称变更),可是工做副本仍旧对映到同一仓库的同一目录时使用 这个命令更新工做副本与仓库的对应关系。 1七、解决冲突 svn resolved: 移除工做副本的目录或文件的“冲突”状态。 用法: resolved PATH... 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的 相关文件,而后让 PATH 能够再次提交。 1八、输出指定文件或URL的内容。 svn cat 目标[@版本]...若是指定了版本,将从指定的版本开始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也能够写具体版本号,这样输出结果是能够提交的)