SVN教程

SVN简介

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,它的设计目标就是取代CVS。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。 

    Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。   

SVN的一些概念

  • repository(源代码库):源代码统一存放的地方

  • Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份

  • Commit(提交):当你已经修改了代码,你就需要Commit到repository

  • Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更。

日常开发过程其实就是这样的(第一次刚入职先从源代码库checkout源码,已经Checkout并且已经工作了几天后):Update(获得最新的代码) –>作出自己的修改并调试成功 –> Commit(大家就可以看到你的修改了) 。

如果两个程序员同时修改了同一个文件呢, SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提示文件Confict, 冲突,需要手动修改。

SVN的安装

1.下载svn软件,在浏览器中打开 http://subversion.apache.org/packages.html#windows

2.下载成功后安装到指定目录。然后把svn安装目录里的bin目录添加到环境变量path中。
这里写图片描述

3.配置成功后,在命令行窗口输入svnserve –version来测试一下是否安装成功

这里写图片描述

SVN创建版本库

    使用命令 svnadmin create 路径
    例如  svnadmin  create  d:\svnrepertory 


SVN的启动

    启动命令:svnserve -d -r 仓库路径
                     -d:后台执行 
                     -r:版本库的根目录  

这里写图片描述

由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式,分为多仓库和单仓库。

单仓库(直接指定路径到仓库的根路径),这种情况下,一个svnserve只能为一个版本库工作。
直接使用svn://localhost:3690/就能直接访问。

这里写图片描述

多仓库,如果一个目录下有多个仓库,我们启动时指定的是仓库的父目录,那么表示启动多仓库。

多仓库的访问是 svn://localhost:3690/xxx 。 svn://localhost:3690/默认访问的是仓库的父目录,后面需要加上指定仓库的名称。

服务启动的一个小问题

服务器启动成功后,控制台页面需要一直开启,不能关闭,一关闭服务就停止。  

我们可以将启动注册成操作系统的服务,来方便我们开启关闭 。  

注册服务的命令  sc create svn(服务名称) binpath= "D:\Subversion\bin\svnserve.exe(svn目录) --service -r D:\svnrepertory(仓库的目录)" displayname= "SVN-Service" start= auto depend= Tcpip

删除服务的命令  sc delete 服务名称 

然后就可以直接执行开启关闭服务等操作,也可以设置开机启动。

这里写图片描述

SVN的简单操作

svn检出操作

我们创建一个空目录D:\\Demo\user1,用来模仿用户。在这个目录我们执行检出操作。

这里写图片描述

这个目录会多出一个隐藏目录 .svn。我们可以设置电脑的显示隐藏文件查看。
.svn文件是subversion的版本控制信息文件,最好不要随便修改。  

svn提交操作

我们在刚才创建的目录D:\\Demo\user1 创建一个文件demo1.txt ,然后提交 svn  commit demo1.txt。这时候会出现错误。

这里写图片描述

该错误是因为我们的文件并未添加到版本控制文件信息中,我们需要使用add子命令,添加到本地版本库 
我们添加版本控制信息后再次提交,又出现错误。

这里写图片描述

这个错误是因为我们没有设置编辑器来设置日志信息。我们可以用-m参数来设置日志信息。
然后提交,这时候又出现错误。

这里写图片描述

这个错误因为我们没有权限的问题。后面我们会讲权限的配置,这时候我们可以先设置为匿名访问。
我们设置仓库的conf/svnserve.conf文件的anon-access属性。 

anon-access: 控制非鉴权用户访问版本库的权限,取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:read

这里写图片描述

然后进行提交,成功。

创建另一个目录模拟用户2 D:\\Demo\user2,我们先使用checkout指令 ,然后就能获得到我们user1创建的文件, 

这里写图片描述

然后用户2对文件进行修改,提交。
然后用户1对文件执行更新指令,就能获得到用户2修改后的版本 svn update  

这里写图片描述

SVN的配置相关用户和权限

进入仓库的/conf目录 修改默认配置文件配置,包括svnserve.conf、passwd、authz 配置相关用户和权限。
1.先打开svnserve.conf文件,将里面的 auth-access = write注释去掉。这个选项是开启权限认证 

    auth-access: 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:write 

    然后将password-db = passwd注释去掉 ,这个是确定账号配置文件的位置。
    将authz-db = authz注释去掉 ,确定认证配置文件位置。

这里写图片描述

2.然后打开passwd用户名口令文件,由svnserve.conf的配置项password-db指定,缺省为conf目录中的passwd。该文件仅由一个[users]配置段组成。,配置我们的账号密码,一行一个账号密码。 

这里写图片描述

3.权限配置文件由svnserve.conf的配置项authz-db指定,缺省为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。 

配置组,给一组用户配置权限,而不用每个都一一进行配置。 

这里写图片描述

配置多仓库权限,用[]指定仓库名称,例如[svn:/] ,如果[svn:/doc] 则表示对svn仓库下的doc目录进行权限配置 

        使用@组名=权限名  对组进行权限配置 
        使用账号名=权限名 对单个账号进行配置
        使用*表示对其他用户进行配置 

这里写图片描述

配置单仓库权限
            由于单仓库不用指定仓库名  直接使用[/]指定单仓库,其他配置都一样

TortoiseSVN

我们上面的操作都是在控制台上输入命令进行操作,这个软件是允许我们以图形化界面的方式操作,免去很多繁琐命令。

创建一个空目录,右键通过TortoiseSVN创建一个仓库。
然后用户就可以通过右键进行checkout、update、commit、add等操作 

这里写图片描述

使用TortoiseSVN后,我们的文件上会多一些图标,用来文件表示不同的状态。

这里写图片描述

SVN解决冲突

假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。

1.我们让A和B同时检出一份文件。 

这里写图片描述

2.用户B对文件进行修改,然后提交 

这里写图片描述

3.用户A对文件进行修改,然后提交,这时候服务器上的文件已经更新过了 

这里写图片描述

4.出现错误,提示文件已经更新,我们点击ok,然后选择update更新文件 

这里写图片描述

这里写图片描述

5.因为实际上SVN管理源代码是以行为单位的,A和B用户对同一行进行了修改,这时候就会出现冲突

这里写图片描述

6.我们要提交的文件会多出来两个文件,一个文件是原来有的内容,一个是B用户修改的内容 

这里写图片描述

7.我们右键要提交的文件,选择编辑冲突 

这里写图片描述

8.Theirs窗口为服务器上当前最新版本
  Mine窗口为本地修改后的版本
  Merged窗口为合并后的文件内容显示

  如果要使用服务器版本,在Theirs窗口选中差异内容,右键,选择Use this text block(使用这段文本块)。
  同理如果要使用本地版本,在协商后,在Mine窗口右键,选择Use this text block(使用这段文本块)

  然后点击保存    ,然后点击Mark  as  resolved解决冲突即可。      

这里写图片描述

Eclipse SVN插件

我自己也写了一些SVN插件使用的东西,可是效果不好,总觉得乱糟糟的一片。我发现了一篇很棒的关于SVN插件使用的教程。大家可以去这个大神这里学习。

http://blog.csdn.net/v123411739/article/details/22512133

SVN目录规范

创建仓库以后,可以选择创建目录规范(create folder structure)。然后我们看仓库浏览器,仓库会多出来三个文件夹。

这里写图片描述

这里写图片描述

trunk:主线,用于存放程序的整个进度
branches:分支。
tags:标签(版本),此目录下的内容不能修改 


Branches 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。
比如项目 demo 下有两个小组,svn 下有一个 trunk 版。
由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组 1 继续完成原来正进行到一半的工作(某个模块),小组 2 进行新需求的开发。
那么此时,我们就可以为小组2建立一个分支,分支其实就是 trunk 版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过(合并)功能,将分支合并到 trunk 上来,从而最后合并为一个项目。 


版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。
Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本.例如xx系统1.0版本。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐