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版本。