SVN学习笔记
SVN背景知识
SVN,全称Subversion, 是一个开放源码的集中式版本控制系统,这里需要注意的一个点就是集中式,所谓的集中式,就是说,SVN管理的所有仓库都位于一个集中的服务器上,如下图所示
SVN官网:SVN官网
SVN安装:SVN支持多个平台,包括Windows,Mac,Linux等,官网上提供了详细的安装指南,这里我使用的是Centos6,对应的安装步骤如下
- 首先使用
svn --version
检查看系统是否已经安装了SVN
- 如果提示命令未找到,则需要安装svn,安装命令为
yum install subversion
- 安装完毕后重新使用
svn --version
检查看是否已经安装成功
到这里为止,SVN安装完毕
版本管理的几个重要概念
在版本控制系统中,有几个比较重要的概念,罗列如下
- 仓库/版本库/Repository:值得是项目所要存放的地方,可以将粗略地将其认为就是一个项目,不同的项目对应不同的仓库
- 版本 version:项目的一次修改即可以作为一个版本
- 分支 branch:从某一个版本开始,衍生出来的另一份,与原来的那一份独立,可以在分支上进行独立的操作,然后将两个不同的分支进行合并
- 标签 tag:给某一个版本起的一个名字,主要用于里程碑式版本,比如v1.0等
SVN的使用
SVN分为两部分,一部分是服务端部分,一部分是客户端部分,服务端部分主要是提供代码的托管,版本的管理等,客户端主要是提交、修改等的操作,客户端操作完毕后,将对应的修改提交至服务端
创建仓库
在使用SVN进行版本管理的时候,一般而言,对于每一个项目,我们会为其创建一个仓库,来单独管理,操作命令如下
svnadmin create /PATH/TO/DIR
, 比如这里的 svnadmin create /opt/svn/repo1
创建完仓库之后,仓库的主要内容如下所示,注意每个仓库下均有这些内容
其中我们需要关系的是conf目录下的几个文件,分别为 authz
、passwd
、svnserve.conf
对应作用如下
-
authz: 授权账号及仓库的配置
-
passwd:账号以及密码的配置
-
svnserve.conf:用于配置SVN服务端守护进程
前面两个文件的内容比较好理解,后面的主要用于配置仓库的未授权用户允许的操作,授权用户文件列表位置,账户密码位置等信息
这里举一个简单的配置信息,内容如下
# passwd 文件
[users]
huanfeng = huanfeng # 配置一个名为huanfeng的用户,对应的密码为huanfeng
test = test # 配置一个名为test的用户,对应的密码为test
# authz 文件
[groups] # 组的配置
admin = huanfeng
test = huanfeng, test
[repo1:/] # 仓库的配置,语法为,[仓库名:仓库目录下的路径],可以配置多个仓库,多个目录
@test = r # 使用@为组进行配置
huanfeng = rw # 也可以单独为每个用户进行配置
# svnserve.conf配置
[general]
anon-access = none # 未授权用户,none表示禁止其进行访问
password-db = passwd # 配置passwd路径,这里表示当前目录下的passwd,也可以为所有的仓库指定一个共有的passwd即可
authz-db = authz # 配置授权信息,如上
启动svnserve进程,使得svnserve可以为我们提供服务
svnserve -d -r PATH --listen-port PORT
,-d
,daemon表示以守护进程的方式运行,也就是后台运行,这里的-r表示root dir
, PATH可以有两种指定方式,分别为指定具体的一个仓库,如/opt/svn/repo1
,也可以为所有仓库的根目录,如 /opt/svn/
,如果仅仅指定一个仓库,则只能为该仓库提供服务,如果指定所有仓库,则可以为所有的仓库提供服务。默认的访问端口为 3690
至此,名为repo1的仓库的配置就完成了,对应的仓库访问路径为 svn://HOST/REPO_NAME
,这里为 svn://192.168.38.132/repo1
签出代码
创建完仓库之后,我们需要做的,就是仓库中的内容签出到本地,checkout,可以理解为将其拷贝一份到本地,当然,签出的内容是受到svn管理的,也就是说,签出的仓库,svn会跟踪每个文件的变化情况,每个参与开发的人都可以签出一份,然后进行自己的修改,修改完毕后提交到svn,由svn将其进行合并
签出命令 svn checkout svn://192.168.38.132/repo --username=huanfeng
,这里使用使用--username
选项指定操作的用户
输入密码即可
签出结果
提交修改
从上面签出的目录图中可以看到,此时的仓库里面没有任何内容,为了使得仓库的结构更加合理,一般来说,我们会在仓库下创建三个主要的目录,分别为trunk
、branches
、tags
,对应用途如下
- trunk,用于存放主分支代码
- tranches,用于存放其他分支及代码
- tags,用于存放各个标签及对应的代码
操作如下图所示
在每一个操作完毕之后,我们都需要将对应的修改添加并且提交到中央仓库,这样,其他人才能用看到我们的修改,并且使用我们的修改
操作步骤为
-
svn add FILE
, 指定所要添加的内容
-
svn commit -m "COMMENT"
,使用-m
指定说明内容,一般而言,每一个提交尽量都给出合理的说明,这样方便团队了解到本次提交的操作的内容
为了看到操作的结果,我们再签出一份代码,位于/tmp/svn/repo_another
,操作结果如下所示
可以看到,上次我们的提交操作已经生效了
当然,如果仅仅是为了查看提交的记录的话,我们可以使用 svn log REPO_DIR
查看即可
上图中的r1表示当前所在的分支
更新仓库
由于每个开发者都签出一份代码,进行自己的修改,然后再进行提交,那么,就会有这样的一个问题,当别人提交后,我们怎么获取别人更新的内容呢,可以使用 svn update
命令即可
比如这里,我们在刚刚签出的两份代码中的一个仓库中添加一个文件,然后提交更改
可以使用 svn status
查看仓库当前的状态,?表示该文件没有受到svn的管理,如果需要将其纳入管理,则使用svn add
命令将其加入即可
提交文件后,我们在另外一个仓库中执行 svn update
,即可将其他人提交的更新同步下来
有时候我们会遇到这样的情况,在提交更新的时候,出现下面的提示
主要的原因在于,已经有其他人更改了这个文件,并且提交了这个文件,此时服务端仓库的这个文件的版本已经新与当前仓库的版本,所以我们需要先更新当前仓库,再进行提交
执行完svn update
,突然出现了下面的情况
原因在于,我们在两个仓库中对同一个文件的同一行就行了修改,这里的具体原因在于,我在一个仓库中对test.txt新增了一行,并且提交,同时,在另一个仓库中对该文件的该行也进行了修改,并且尝试提交,此时,svn在合并两个文件的时候就检测到了冲突的存在了,于是给出上面的提示
执行 svn diff
可以看到具体的冲突所在
于是,根据提示的内容,对该文件进行修改,解决冲突,然后重新提交
解决冲突的方式主要有一下几种
- 采用对方的内容,此时会覆盖自己的内容
- 采用自己的内容,此时提交后会覆盖对方的内容
- 手动进行修改,直至没有冲突存在
版本回退
有时候,我们编辑了某个文件,然后突然发现,编辑错了,或者不小心把太多东西改了,这个时候,如果想撤销本次的修改,可以有两种方式
- 直接按住
ctrl + z
一直撤销,这个比较累 - 使用
svn revert FILE
即可,如果是文件夹,则使用-R
选项,递归撤销
比如我们编辑了test.txt文件,然后撤销
如果想要回退到某个版本,则可以使用 svn merge -r CURRENT_VERSION:TARGET_VERSION FILE
如果发现回退错了,可以先使用 svn update
更新至最新版本,再进行新的回退
分支管理
分支主要用于在某种情况下,需要对版本进行操作,而又不能直接在当前分支在进行,比如,此时想修复某个bug,但同时开发线又不能停下来,此时,最好的方式就是创建一个分支,然后在分支上进行bug修复,最后将分支进行合并即可
创建分支 svn copy trunk/ branches/BRANCH_NAME
,如svn copy trunk/ branches/issue_001
需要注意的是,创建分支后,同样需要把创建分支的操作进行提交,否则,创建分支的操作只会发生在本地
合并分支,先进入到目的分支,然后执行 svn merge TARGET_BRANCH
即可
标签管理
如果想要给某个版本打个标签,可以使用 svn copy trunk/ tags/VERSION
, 如 svn copy trunk/ tags/v1.0
需要注意的是,打个标签之后,需要把本次操作进行提交,否则,创建标签的操作,只会发生在本地
Window平台的操作
我们上述的操作都是在Linux上进行的,对于Windows平台,可以使用tortoisesvn这个软件来辅助完成
总结
本节主要学习了svn的概念,svn的安装,svn仓库的配置,svn的基本操作,如创建仓库、签出代码、添加文件、提交更改、查看状态、查看提交记录、创建分支、创建标签等等,从创建分支以及创建标签的操作中,可以看到,svn的这两项操作本质上其实是进行拷贝,这种操作仓库比较大的时候其实是比较鸡肋的,而且比较耗时和占资源,新一代的版本管理Git则不会出现这种情况,我们将在后面学习Git,感受下Git相对于SVN的优化