[toc]
什么是SVN?
答:Apache Subversion 通常被缩写成 SVN,是一个开源的中心服务器版本控制系統,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分(现在基本已经被git取代
);
为什么要使用SVN? 答:程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本。而这些数据是放置在一个中央资料档案库(repository) 中,这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动;这样您才能把档案恢复到旧的版本, 或是浏览文件的变动历史。
SVN 术语:
SVN 的主要功能:
SVN 生命周期
Create 操作
是用来创建一个新的版本库;问:搭建SVN服务常用什么工具? 答:Subversion
Subversion是什么? 它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历史,Subversion可以通过网络访问它的版本库,从而使用户在不同的电脑上进行操作。
TortoiseSVN图标介绍
WeiyiGeek.图标介绍
注意事项:
描述:SVN Server即可以在Windows上也可以在Linux中进行安装使用;
yum install -y subversion
apt-get install subversion
而我们下面实验是以Windows Server 2008R2环境为主,考虑到只是一些老项目在使用svn而现在大部分的开发也以及采用git进代码管理;
搭建实例
WeiyiGeek.VisualSVN server
WeiyiGeek.SVN
TortoiseSVNSVN连接,下载TortoiseSVNserver
,下载完成后双击安装如下图:WeiyiGeek.安装客户端
VisualSVN server
WeiyiGeek.新建仓库
VisualSVN Client
WeiyiGeek.
WeiyiGeek.
4.复制档案及目录 branch
WeiyiGeek.
5.合并动作 merge
WeiyiGeek.
6.制作 Tag 或是 Release
WeiyiGeek.
(1)版本库创建 主要针对于在服务端进行SVN版本库的相关配置:
mkdir /opt/svn
#利用svn命令创建版本库
svnadmin create /opt/svn/runoob
#使用命令svnserve启动服务
svnserve -d -r 目录 --listen-port 端口号
由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式:
#方式一:-r直接指定到版本库(称之为单库svnserve方式)
svnserve -d -r /opt/svn/runoob #个svnserve只能为一个版本库工作。使用类似这样的URL:svn://192.168.0.1/ 即可访问runoob版本库
#authz配置文件
[groups]
admin=user1
dev=user2
[/]
@admin=rw
user2=r
#方式二:指定到版本库的上级目录(称之为多库svnserve方式-常用)
svnserve -d -r /opt/svn #一个svnserve可以为多个版本库工作,使用类似这样的URL:svn://192.168.0.1/runoob 即可访问runoob版本库。
#authz配置文件
[groups]
admin=user1
dev=user2
[runoob:/]
@admin=rw
user2=r
[Secruity:/]
@admin=rw
user2=r
(2) 用户和权限
描述:进入/opt/svn/Secruity/conf
目录修改默认配置文件配置,包括svnserve.conf、passwd、authz
配置相关用户和权限。
svn服务配置文件为版本库目录中的文件conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = /home/svn/passwd
authz-db = /home/svn/authz
realm = tiku
用户名口令文件passwd:由svnserve.conf的配置项password-db指定;
[users]
admin = admin
thinker = 123456
权限配置文件:由svnserve.conf的配置项authz-db指定,默认为conf目录中的authz
#[groups]配置段中配置行格式如下:
<用户组> = <用户列表>
#版本库路径权限段的段名格式如下:
[<版本库名>:<路径>]
#基础性示例
[groups]
g_admin = admin,thinker
[admintools:/]
@g_admin = rw
* =
[test:/home/thinker]
thinker = rw
* = r
(1)SVN 检出操作
$svn checkout svn://192.168.0.1/Secruity --username=user01
(2)SVN 提交操作
#查看工作副本中的状态。
svn status
#将文件readme加到版本控制,等待提交到版本库。
svn add readme
#此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。
$svn status
A readme
#上注释信息来提交
svn commit -m "SVN readme."
(3)SVN 解决冲突 版本冲突原因: 假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。 同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。
现版本冲突的解决方法:
#查看更改
svn diff
#提交更改
svn commit -m "change HelloWorld.html first"
#此时提交失败,为了避免两人的代码被互相覆盖,Subversion 不允许我们进行这样的操作。
#所以我们在提交更改之前必须先更新工作副本。所以使用 update 命令
svn update #输入"mc",以本地的文件为主。你也可以使用其选项对冲突的文件进行不同的操作
# 选择:(p)推迟,(DF)显示DIFF,(E)编辑文件,(M)合并,
# (MC)我冲突的一面,(TC),其冲突的一面,
# (s)显示全部选项:MC
#默认是更新到最新的版本(可以指定更新)
svn update -r6
#此时工作副本是和仓库已经同步,可以安全地提交更改了
svn commit -m "change HelloWorld.html second"
(4)SVN 版本回退 描述:svn revert 操作将撤销任何文件或目录里的局部更改。
svn status
#通过 svn revert 文件 readme 回归到未修改状态。
svn revert readme
#进行 revert 操作之后,readme 文件恢复了原始的状态
svn status
#revert 操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用 -R 命令
svn revert -R trunk
#假如我们想恢复一个已经提交的版本怎么办为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本( reverse merge)
#首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。
svn merge -r 22:21 readme
(5)SVN 查看历史信息 描述:通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改
#svn log: 用来展示svn 的版本作者、日期、路径等等。
svn log -r 6:8 #查看特定的某两个版本之间的信息
svn log trunk/HelloWorld.html #查看某一个文件的版本修改信息
svn log -l N -v #目录的信息以及显示限定N条记录的目录信息
#svn diff: 用来显示特定修改的行级详细信息。哺乳纲不带任何它将会比较你的工作文件与缓存在 .svn 的"原始"拷贝。
svn diff -r 3 rule.txt #比较你的工作拷贝(本地)和版本库中版本号为 3 的文件 rule.txt
svn diff -r 2:3 rule.txt #较版本库与版本库
#svn cat: 取得在特定版本的某文件显示在当前屏幕。
svn cat -r 版本号 rule.txt
#svn list: 显示一个目录或某一版本存在的文件(可以在不下载文件到本地目录的情况下来察看目录中的文件)。
svn list http://192.168.0.1/Secruity
(6)SVN分支(重点) 比如项目 demo 下有两个小组,svn 下有一个 trunk 版。
#1.我们在本地副本中创建一个 my_branch 分支。
svn copy trunk/ branches/my_branch
svn status
#2.提交新增的分支到版本库。
svn commit -m "add my_branch"
#3.接着我们就到 my_branch 分支进行开发,切换到分支路径并创建 index.html 文件并将其将加入版本控制,并提交到版本库中。
~/svn/Secruity/branches/my_branch# svn status
? index.html
~/svn/Secruity/branches/my_branch# svn add index.html
A index.html
~/svn/Secruity/branches/my_branch# svn commit -m "add index.html"
Adding index.html
Transmitting file data .
Committed revision 10.
#4.切换到 trunk,执行 svn update,然后将 my_branch 分支合并到 trunk 中。
svn merge ../branches/my_branch/
#5.此时可以看到 trunk 中已经多了 my_branch 分支创建的 index.html 文件。然后将合并好的 trunk 提交到版本库中。
svn commit -m "add index.html"
(7) SVN 标签(tag) 描述;通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。
#1.我们在本地工作副本创建一个 tag。
svn copy trunk/ tags/v1.0
#2.新的目录将会被创建在 tags 目录下。
ls tags/
ls tags/v1.0/
#3.查看状态
svn status
#4.提交tag内容
svn commit -m "tags v1.0"