linux环境下SVN使用方法

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的基本概念
 示意图
linux环境下SVN使用方法
 配置库(*资料档案库repository)
–SVN的核心是配置库,储存所有的数据,配置库按照文件树形式储存数据-包括文件和目录,任意数量的客户端可以连接到配置库,读写这些文件。通过写数据,别人可以看到这些信息;通过读数据,可以看到别人的修改。
–SVN会记录配置库中的每一次更改,不仅针对文件也包括目录本身,包括增加、删除和重新组织文件和目录。
linux环境下SVN使用方法
 工作副本(Workspace)
与位于*配置库相对应的是每个人的工作空间,它是每个程序员工作的地方,程序员从配置库拿到源代码,放在本地作为工作副本,在工作副本上进行查看、修改、编译、运行、测试等操作,并把新版本的代码从这里提交回配置库中。
linux环境下SVN使用方法
3.2 SVN的基本流程
linux环境下SVN使用方法
3.3 SVN的工作模式
 工作模式一:复制修改合并(SVN默认方案)
linux环境下SVN使用方法
 工作模式二:锁定修改解锁
linux环境下SVN使用方法

4 用户常用操作命令
4.1 查看SVN版本号
 命令:svn –version
linux环境下SVN使用方法
4.2 SVN帮助
 命令:svn help
linux环境下SVN使用方法
4.3 查看版本库下文件和目录列表
 命令:svn list 【PATH】 简写:svn ls 【PATH】
linux环境下SVN使用方法
4.4 查看文件日志
 命令:svn log 【PATH】
linux环境下SVN使用方法
4.5 检出(checkout)到本地目录
 checkout导出文件后,文件仍处在SVN版本控制中,与版本库保持联系。export导出的版本文件脱离SVN版本控制,修改后无法update和commit操作;
 先在本地创建一个目录(checkout的存放地点),命令:mkdir 【PATH】/filename;
 进入刚创建的目录cd 【PATH】;
 检出命令:svn checkout 【PATH】, 简写:svn co 【PATH】
linux环境下SVN使用方法
4.6 添加(add)新的文件到版本库
 进入已经checkout到本地的目录下,在适当的目录下建立文件;
 然后使用命令:svn add 【filename】or【Dir】;
 例如,添加一个文件:svn add test.c,添加test.c;
 例如,添加多个文件:svn add *.c,添加目录下所有的c文件;
 注意:add只是将本地目录下的文件与SVN版本库进行了关联,只有提交(commit)后才会在版本库中创建成功。
 如下图所示,添加vcs.log文件到版本库:
linux环境下SVN使用方法
 如下图所示,添加文件夹“64”内含文件到版本库:
linux环境下SVN使用方法

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将版本库中的文件拷贝到本地的工作副本中。
linux环境下SVN使用方法

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版本库。
linux环境下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。
 所示示例:
linux环境下SVN使用方法
 解锁示例:
linux环境下SVN使用方法

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”
 删除文件示例:
linux环境下SVN使用方法
 删除一个目录及其包含的文件示例:
linux环境下SVN使用方法

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
linux环境下SVN使用方法

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】,显示每个项目的完全修订版本信息。
linux环境下SVN使用方法

4.13 恢复本地修改(revert)
 恢复所有对文件和目录的修改;
 不仅恢复本地目录中一个项目的内容,也包括对属性的恢复;
 本子命令不会存取网络,并且会解决冲突的状况,但不会恢复被删除的目录;
 命令:svn revert 【PATH】
 如下图所示,结合svn diff的例子,0x800080000改为0x800020000。现在使用revert命令恢复BinLiteConfig.h的修改。即恢复为0x800080000,恢复后,采用diff命令查看无差异,表示恢复成功。
linux环境下SVN使用方法

4.14 查看文件详细信息(info)
 命令:svn info 【PATH】;
 显示工作拷贝路径和URL的详细信息,包括:
 路经
 名称
 URL
 版本库的根
 版本库的UUID
 Revision
 节点类型
 最后修改的作者
 最后修改的修订版本
 最后修改的日期
 锁定令牌
 锁定拥有者
 锁定创建时间
 锁定失效时间 (date)
linux环境下SVN使用方法

4.15 输出指定文件或URL的内容(cat)
 命令:svn cat 【PATH】;
 如果希望不检出而查看版本库的readme.txt的内容,如,
svn cat svn://svnserver/test/readme.txt
linux环境下SVN使用方法

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】
 如下图示例:
linux环境下SVN使用方法

4.19 直接版本库文件导出到本地(export)
 直接将版本库中到文件导出到本地;
 导出后,本地文件不受版本控制,导出到文件夹下没有.svn的隐藏文件夹,即没有版本的元数据信息。
 命令:svn export –r 【version number】 【SVN PATH】 【LOCAL PATH】