SVN学习笔记

SVN学习笔记

SVN背景知识

SVN,全称Subversion, 是一个开放源码的集中式版本控制系统,这里需要注意的一个点就是集中式,所谓的集中式,就是说,SVN管理的所有仓库都位于一个集中的服务器上,如下图所示

集中式

SVN官网:SVN官网

SVN安装:SVN支持多个平台,包括Windows,Mac,Linux等,官网上提供了详细的安装指南,这里我使用的是Centos6,对应的安装步骤如下

  1. 首先使用 svn --version 检查看系统是否已经安装了SVN
    SVN安装情况
  2. 如果提示命令未找到,则需要安装svn,安装命令为 yum install subversion
    安装SVN
  3. 安装完毕后重新使用 svn --version 检查看是否已经安装成功
    SVN安装情况

到这里为止,SVN安装完毕

版本管理的几个重要概念

在版本控制系统中,有几个比较重要的概念,罗列如下

  • 仓库/版本库/Repository:值得是项目所要存放的地方,可以将粗略地将其认为就是一个项目,不同的项目对应不同的仓库
  • 版本 version:项目的一次修改即可以作为一个版本
  • 分支 branch:从某一个版本开始,衍生出来的另一份,与原来的那一份独立,可以在分支上进行独立的操作,然后将两个不同的分支进行合并
  • 标签 tag:给某一个版本起的一个名字,主要用于里程碑式版本,比如v1.0等

SVN的使用

SVN分为两部分,一部分是服务端部分,一部分是客户端部分,服务端部分主要是提供代码的托管,版本的管理等,客户端主要是提交、修改等的操作,客户端操作完毕后,将对应的修改提交至服务端

创建仓库

在使用SVN进行版本管理的时候,一般而言,对于每一个项目,我们会为其创建一个仓库,来单独管理,操作命令如下

svnadmin create /PATH/TO/DIR, 比如这里的 svnadmin create /opt/svn/repo1

创建完仓库之后,仓库的主要内容如下所示,注意每个仓库下均有这些内容

svn仓库内容

其中我们需要关系的是conf目录下的几个文件,分别为 authzpasswdsvnserve.conf对应作用如下

  • authz: 授权账号及仓库的配置


    authz文件主要内容
  • passwd:账号以及密码的配置


    passwd文件主要内容
  • svnserve.conf:用于配置SVN服务端守护进程


    svnserve.conf

前面两个文件的内容比较好理解,后面的主要用于配置仓库的未授权用户允许的操作,授权用户文件列表位置,账户密码位置等信息

这里举一个简单的配置信息,内容如下

# 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

启动svnserve

至此,名为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选项指定操作的用户

svn签出操作

输入密码即可

签出结果

svn签出结果

提交修改

从上面签出的目录图中可以看到,此时的仓库里面没有任何内容,为了使得仓库的结构更加合理,一般来说,我们会在仓库下创建三个主要的目录,分别为trunkbranchestags,对应用途如下

  • trunk,用于存放主分支代码
  • tranches,用于存放其他分支及代码
  • tags,用于存放各个标签及对应的代码

操作如下图所示

初始化仓库目录

在每一个操作完毕之后,我们都需要将对应的修改添加并且提交到中央仓库,这样,其他人才能用看到我们的修改,并且使用我们的修改

操作步骤为

  1. svn add FILE, 指定所要添加的内容
    添加文件
  2. svn commit -m "COMMENT",使用 -m指定说明内容,一般而言,每一个提交尽量都给出合理的说明,这样方便团队了解到本次提交的操作的内容
    提交修改

为了看到操作的结果,我们再签出一份代码,位于/tmp/svn/repo_another,操作结果如下所示

操作结果

可以看到,上次我们的提交操作已经生效了

当然,如果仅仅是为了查看提交的记录的话,我们可以使用 svn log REPO_DIR查看即可

svn log 操作结果

上图中的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 撤销修改

如果想要回退到某个版本,则可以使用 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 创建分支

需要注意的是,创建分支后,同样需要把创建分支的操作进行提交,否则,创建分支的操作只会发生在本地

合并分支,先进入到目的分支,然后执行 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的优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容