版本库
Subversion是文件服务系统,一个特别的文件系统。它可以记录每一次的更改,包括文件和目录的修改,增删等。
版本模型
锁定–修改–解锁
图一锁定–修改–解锁方案
拷贝–修改–合并
图二拷贝–修改–合并方案
工作拷贝
一个subversion工作拷贝是本地机器一个普通的目录,保存着一些文件,可以任意编辑文件。工作拷贝时在私有工作区,在明确的做了特定操作之前,subversion不会把修改与其他人的合并,也不会把你的修改展示给别人。
修订版本
图三 subversion版本库
Subversion的修订号是针对整个目录树的,而不是单个文件。每一个修订号代表了一次提交后版本库整个目录树的特定状态,另一种理解是修订号N代表版本库已经经过了N次提交。同一时刻仓库中所有文件都处于同一个修订版本。
Cvs是针对每个文件进行。在同一个时刻,仓库中的文件可能处于不同的修订版本。如图四所示,文件名后面的数字代表此文件的修订版本。
图四 cvs版本库示意
分支和标签
分支
图五开发分支
用途:针对不同的小需求,维护不同的版本;协作开发时,个别人员可在分支上进行开发,在适当时间合并到主干上来。
Subversion的分支存在于真实的正常文件系统中,并不是存在于另外的维度,这些目录只是保留了额外的历史信息。如下面的目录结构,三个分支都有目录与之对应,只是他们的历史信息不一样,如图五所示,分支1可能从修订版本n拷贝过来,分支2则可能是从修订版本m拷贝过来,分支3则可能从修订版本k拷贝过来(m<n<k)。
C:/USERS/SIY/PROJ
├─branch
│├─branch2
│├─branch3
│└─branch4
├─tags
└─trunk
标签
用途:保存发布的版本。
Subversion的标签和分支一样,也存在于真实的文件系统中。开发人员时间软件功能后,向用户发布时,应该将发布的源代码,文档,二进制文件拷贝一份作为备份,这个备份通常可以叫做标签。这些标签不再做任何更改,一直保存在仓库中。
C:/USERS/SIY/PROJ
├─branch
│├─branch2
│├─branch3
│└─branch4
├─tags
│├─proj_1.0.0.1
│├─proj_1.0.0.2
│└─proj_2.0.0.0
└─trunk
本质上讲,分支和标签没有本质的区别,只是开发者人为的划分,它们都是主干上的一个拷贝而已。
要生成分支或者标签只需要使用svncopy命令拷贝相应目录即可,具体可svnhelp copy查看帮助。
使用心得
图形界面vs命令行
1、查看工作拷贝中哪些目录、哪些文件做了修改?
D:/work/workspace>svnst
? trunk/Release
? trunk/Debug
? trunk/controlled.opt
? trunk/controlled.ncb
? trunk/test/Release
? trunk/test/test.plg
? trunk/Controller/Controller_i.c
? trunk/Controller/Release
? trunk/Controller/Controller_i.h
? trunk/Controller/Debug
? trunk/Controller/res/Thumbs.db
M trunk/Controller/ForwardMgrSplit.cpp
! trunk/test_lib/test_lib.ncb
……
很显然,图形界面直观方便。
2、对比工作拷贝最新状态和原始状态的区别。
图形界面无法对整个目录进行对比操作,操作很繁琐;如果查看每个文件的不同,并且每个文件都提交的话,在文件很多的情况下,会形成过多的修订版本。
命令行可对整个目录进行比较操作,可方便查看每个不同之处、了解整体的修改情况、对整个文件夹进行提交。
3、提交修改文件。
图形界面提交:可对整个文件夹进行提交,但无法同时查看所有修改,不便写修改日志;每个文件提交一次产生过多的修订版本。
命令行提交:可对整个文件夹进行提交,可同时查看所有修改,方便写修改日志。
4、备份和恢复操作。
在tortoise svn的图形界面中未发现此功能……
命令行备份svnadmin dump 仓库路径 > proj1.dump (可以对指定的修订版本进行备份,具体看命令的帮助)
命令行恢复:
svnadmin create 仓库路径
svnadmin load 仓库路径 < proj1.dump
图形界面和命令行可结合使用,以命令行为主,图形界面主要用于查看哪些目录哪些文件被修改。
工作流程
1、单人工作过程
l创建仓库
svnadmin create 仓库路径
如:svnadmin create e:/mycode/proj1
若仓库已经存在则跳过
l导入
svn import 本地路径仓库路径
svn import e: /proj1svn:///e:/mycode/proj1 (内网搭建的是https的访问方式)
若已经导入则跳过。导入之后可将proj1删除,真正要编辑的文件要从仓库中导出。
l导出
svn checkout 仓库路径本地路径
如:svn checkout svn:///e:/mycode/proj1 e:/work/proj1
checkout可简写成co,若已经有本地副本则跳过
l更新
svn update
如:进入e:/work/proj1,svn update
l修改
进行正常的编程,对于文件的删除添加等操作应该使用svn del,svn add等操作,不能直接使用资源管理器进行操作,否则svn服务器无法知晓。
l提交
svn commit –m “日志”
或者
svn commit (需要配置编辑器),见注册表文件按editor.reg,此处配置的gvim。
2、多人协作过程
l创建仓库
l导入
l导出
l更新
l修改
l提交
l处理冲突
l再提交
基本和单人的工作过程一致,多了冲突处理。
3、备份还原
这个在代码迁移中很常用(比如两个物理隔离网络之间的代码迁移)。
svnadmin dump 仓库路径 > proj1.dump (可以对指定的修订版本进行备份,具体看命令的帮助)
命令行恢复:
svnadmin create 仓库路径
svnadmin load 仓库路径 < proj1.dump
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/194532.html