1 简介
Subversion(SVN) 是一个开源的版本控制系統,管理随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。
官方网站:http://subversion.apache.org/
官方手册:http://svnbook.red-bean.com/old-versions.html (subversion 1.6)
中文文档:http://www.svn.org.cn/ http://www.svn.org.cn/category/cclient
公司使用版本:subversion-1.6.11
2 主要特性
目录版本控制: SVN实现了一个 “虚拟” 的版本控管文件系统, 能够依时间跟踪整个目录的变动。 目录和文件都能进行版本控制。
真实的历史版本:你可以增加(add)、删除(delete)、复制(copy)和重命名(rename),无论是文件还是目录。所有的新加的文件都从一个新的、干净的版本开始。
纳入版本管控的原数据:每一个文件与目录都附有一组属性关键字并和属性值相关联。你可以创建, 并存储任何你想要的Key/Value对。 属性是随着时间来作版本控管的,就像文件內容一样。
选择不同的网络层:–自定义的SVN协议访问(svn://host/repository);–SVN作为一个扩展模块嵌入到Apache HTTP服务器中,可以通过(http://host/repository)访问。
一致的数据处理方式:使用二进制差异算法来表示文件的差异, 它对文字(人类可理解的)与二进制文件(人类无法理解的) 两类的文件都一视同仁。 这两类的文件都同样地以压缩形式储存在档案库中, 而且文件差异是以两个方向在网络上传输的。
有效的分支(branch)与标签(tag):在分支与标签上的消耗并不必一定要与项目大小成正比。SVN建立分支与标签的方法, 就只是复制该项目, 使用的方法就类似于硬连接(hard-link)。所以这些操作只会花费很小,而且是固定的时间。
3 基本原理
3.1 SVN的基本概念
示意图
配置库(中央资料档案库repository)
–SVN的核心是配置库,储存所有的数据,配置库按照文件树形式储存数据-包括文件和目录,任意数量的客户端可以连接到配置库,读写这些文件。通过写数据,别人可以看到这些信息;通过读数据,可以看到别人的修改。
–SVN会记录配置库中的每一次更改,不仅针对文件也包括目录本身,包括增加、删除和重新组织文件和目录。
工作副本(Workspace)
与位于中央配置库相对应的是每个人的工作空间,它是每个程序员工作的地方,程序员从配置库拿到源代码,放在本地作为工作副本,在工作副本上进行查看、修改、编译、运行、测试等操作,并把新版本的代码从这里提交回配置库中。
3.2 SVN的基本流程
3.3 SVN的工作模式
工作模式一:复制修改合并(SVN默认方案)
工作模式二:锁定修改解锁
4 用户常用操作命令
4.1 查看SVN版本号
命令:svn –version
4.2 SVN帮助
命令:svn help
4.3 查看版本库下文件和目录列表
命令:svn list 【PATH】 简写:svn ls 【PATH】
4.4 查看文件日志
命令:svn log 【PATH】
4.5 检出(checkout)到本地目录
checkout导出文件后,文件仍处在SVN版本控制中,与版本库保持联系。export导出的版本文件脱离SVN版本控制,修改后无法update和commit操作;
先在本地创建一个目录(checkout的存放地点),命令:mkdir 【PATH】/filename;
进入刚创建的目录cd 【PATH】;
检出命令:svn checkout 【PATH】, 简写:svn co 【PATH】
4.6 添加(add)新的文件到版本库
进入已经checkout到本地的目录下,在适当的目录下建立文件;
然后使用命令:svn add 【filename】or【Dir】;
例如,添加一个文件:svn add test.c,添加test.c;
例如,添加多个文件:svn add *.c,添加目录下所有的c文件;
注意:add只是将本地目录下的文件与SVN版本库进行了关联,只有提交(commit)后才会在版本库中创建成功。
如下图所示,添加vcs.log文件到版本库:
如下图所示,添加文件夹“64”内含文件到版本库:
4.7 更新(update)文件或目录到本地目录
更新SVN版本库到本地目录,显示更新的文件和次数;
命令:svn update –r m 【PATH】, 简写:svn up –r m 【PATH】;
如果svn update后没有目录,默认更新当前目录下的所有文件和子目录到最新版本;
例:svn update –r 200 test.c,将版本200的test.c文件更新到工作副本(本地目录);
如果提交(commit)文件或目录提示过期,是因为冲突,,需先update,再修改,然后提交。
如下图,将新添加的vcs.log文件和文件夹64在工作副本中删除,可以通过update将版本库中的文件拷贝到本地的工作副本中。
4.8 提交(commit)文件到版本库
将本地副本中修改或添加后的文件提交到版本库;
命令:svn commit –m “message” [-N] [–no-unlock]【PATH】(如果选择了保持锁,就使用-no-unlock开关);
简写:svn ci –m “message” [-N] [–no-unlock]【PATH】;
如果后面没有目录,默认将当前目录下所有修改的文件提交到版本库;
例:svn commit –m “add test file to the SVN” test.c,参数-m后写明具体说明,便于后期回顾查找。
如下图,”?”是不在SVN版本库控制中,因此commit只上传修改”M”后的文件到SVN版本库。
4.9 加锁(lock)和解锁(unlock)
锁定版本库的拷贝路径,使其他用户不能提交修改的文件;
锁定命令:svn lock –m “message” [–force]【PATH】;
解锁名利:svn unlock 【PATH】;
锁定示例:svn lock –m “lock test file” test.c;
使用–force可以打破其它用户或工作拷贝的锁定,例如,锁定被其它用户锁定的文件:
svn lock tree.jpg
svn: warning: Path '/tree.jpg is already locked by user 'sally in filesystem ‘/svn/repos/db’
svn lock --force tree.jpg
svn: ‘tree.jpg’ locked by user ‘harry’
解锁示例:svn unlock test.c。
所示示例:
解锁示例:
4.10 删除(delete)
删除版本库中的一个项目;
命令:svn delete 【path】 -m “message”;
简写:svn del或svn remove或svn rm;
如果svn delete【URL】,URL指定的项目会直接从版本库中删除,例如:
svn delete svn://svnserver/domain/test.c –m “delete test file”;
文件在本地副本中删除后,需提交才会从版本库中删除,例如:
svn delete test.c
svn commit –m “delete test file”
删除文件示例:
删除一个目录及其包含的文件示例:
4.11 比较差异(diff)
命令:svn diff 【PATH】,简写:svn di 【PATH】;
修改的文件与基础版本比较,svn diff 【PATH】,例如:
svn diff test.c
对比版本m与版本n的差异,svn diff –r m:n 【PATH】,例如:
svn diff –r 200:201 test.c
4.12 pwd查看文件或者目录状态(status)
svn status、svn diff和svn revert在没有网络的情况下也可以执行(不访问版本库),原因是svn在本地.svn中保留了本地版本的原始拷贝,使用-show-updates选项才会访问版本库;
svn status 【PATH】,目录下的文件和子目录的状态,正常状态不显示,
?:不在svn的控制中;
M:内容被修改;
C:发生冲突;
A:预定加入到版本库;
K:被锁定;
svn status –v 【PATH】,显示每个项目的完全修订版本信息。
4.13 恢复本地修改(revert)
恢复所有对文件和目录的修改;
不仅恢复本地目录中一个项目的内容,也包括对属性的恢复;
本子命令不会存取网络,并且会解决冲突的状况,但不会恢复被删除的目录;
命令:svn revert 【PATH】
如下图所示,结合svn diff的例子,0x800080000改为0x800020000。现在使用revert命令恢复BinLiteConfig.h的修改。即恢复为0x800080000,恢复后,采用diff命令查看无差异,表示恢复成功。
4.14 查看文件详细信息(info)
命令:svn info 【PATH】;
显示工作拷贝路径和URL的详细信息,包括:
路经
名称
URL
版本库的根
版本库的UUID
Revision
节点类型
最后修改的作者
最后修改的修订版本
最后修改的日期
锁定令牌
锁定拥有者
锁定创建时间
锁定失效时间 (date)
4.15 输出指定文件或URL的内容(cat)
命令:svn cat 【PATH】;
如果希望不检出而查看版本库的readme.txt的内容,如,
svn cat svn://svnserver/test/readme.txt
4.16 将两个版本之间的差异合并到当前文件(merge)
命令svn merge –r m:n【PATH】;
将一个分支合并回主干(假定你有一份主干的工作拷贝,分支在修订版本250创建:
$ svn merge -r 250:HEAD svn://svn.red-bean.com/repos/branches/mybranch
U myproj/tiny.txt
U myproj/flo.txt
如果你的分支在修订版本23,你希望将主干的修改合并到分支,你可以在你的工作拷贝的分支上这样做:
$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
U myproj/thhgttg.txt …
合并一个单独文件的修改:
$ cd myproj
$ svn merge -r 30:31 thhgttg.txt
U thhgttg.txt
4.17 解决冲突(resolved)
移除工作副本的目录或文件的“冲突”状态;
本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交;
命令:svn resolved 【PATH】
4.18 直接将本地目录导入版本库(import)
直接将不受版本库控制到本地文件或目录导入到版本库;
导入后,本地文件没有纳入版本控制,需要update后,将文件导入到本地的工作副本,此时的文件受版本控制;
命令:svn import –m “message” 【PATH】
如下图示例:
4.19 直接版本库文件导出到本地(export)
直接将版本库中到文件导出到本地;
导出后,本地文件不受版本控制,导出到文件夹下没有.svn的隐藏文件夹,即没有版本的元数据信息。
命令:svn export –r 【version number】 【SVN PATH】 【LOCAL PATH】