SVN
SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
SVN属于C/S结构软件,分为客户端和服务器端
服务端软件:VisualSVN
网址:https://www.visualsvn.com/
客户端软件:Tortoisesvn
网址:https://tortoisesvn.net/downloads.html
指令介绍
Checkout(检出)
第一次与svn服务器联系,并把项目更新到本地
- 链接到svn服务器端
- 更新服务器端数据到本地
注意Checkout只在第一次时才使用,其余若要更新数据则使用Update
Update(更新)
更新svn服务器代码到本地
Commit(提交/上传)
把代码上传到服务器
- 提交本地数据到服务器端
具体工作流程
软件安装
服务端软件安装(VisualSVN)
配置8443端口号、仓库等设置后进行安装
SVN服务端配置
-
创建一个项目
首先在SVN服务端创建一个公有目录WebApp作为项目目录
在WebApp目录下创建Shop文件夹,作为Shop(版本仓库)
-
创建版本仓库,基本语法(DOS环境):
svnadmin create 项目名 文件夹路径
Shop 仓库目录结构
-
进行服务端监管
客户端输入svn://localhost(或ip地址)可以访问到相关数据仓库(如示例的Shop仓库)
要想要客户端能访问到数据仓库,需要服务端启用该仓库的监管服务
svnserve -d -r 服务端的版本仓库目录
-d 在后台运行
-r 监管目录
-
权限控制
默认情况下,svn服务器是不允许匿名用户上传文件到服务器端的,要更改项目的相关配置文件。
anon-access = write # auth-access = write
让auth-access属性值为write,使该仓库可读可写
SVN客户端软件安装与使用
安装完成后
- 在客户端目标文件夹下右击checkout
- 在弹出的窗口中输入svn://服务器地址(也可以在URL of repository右面的目录中检查),点击OK
- 如果当前文件夹下出现.svn/的隐藏文件夹,说明客户端已经和服务器端建立起了联系
项目经理创建项目
在有文件需要提交时,在当前文件夹下右击选择SVN Commit
- 进入窗口后填写备注信息,选择需要上传的文件,然后点OK提交
-
出现以下界面,说明提交成功
程序员编写项目
以上工作大部分是由项目经理完成的,程序员需要完成另外的操作
- 在文件夹下右击进行检出操作
-
如果有新文件要提交,直接右击Commit(需要填写备注信息和勾选文件)
一般以上指令是在模块开发完毕后上传
项目经理检查进度
-
需要使用Update指令
一般直接右击Update直接更新文件,系统会直接更新到最新版本
其他使用详解
文件图标
右击---》 TortoiseSVN--》setting--》 Icon Overlays--》 Icon Set
常规图标:当客户端文件与服务器端文件完全同步
冲突突变:当客户端提交的文件与服务器端数据有冲突
删除图标:当服务器端数据已删除
增加图标:当我们编写的文件已添加到提交队列
无版本控制图标:当我们编写的文件没有添加到上传队列
修改图标:当客户端文件有修改但未提交
只读图标:当客户端文件以只读形式存在时
锁定图标:当服务器端数据已锁定
忽略图标:客户端文件已忽略,不需要进行上传
忽略文件
希望有一些文件不上传到svn服务器,应该将该文件或该类型的文件添加至忽略列表
右击文件--》 TortoiseSVN--》 Add to ignore list--》 选择忽略的方式(忽略某个文件或某个类型的文件)
版本管理
版本回退
文件夹空白处右击TortoiseSVN--》 Update to revision...--》
一般根据日志进行版本回退
解决版本冲突
在实际项目开发中,如果两个人同时修改某个文件就会产生版本冲突问题
解决方法
合理分配项目开发时间
合理分配项目开发模块
-
通过svn解决版本冲突问题
-
更新服务器端数据到本地(出现冲突后)
-
直接Update
冲突文件会出现其他的副本文件
hello.java:整合后的hello.java文件
hello.java.mine:冲突当事人修改后的hello.java文件
hello.java.rx:代表x版本的文件,版本号低的一般代表起始状态,版本号高的是其他人修改文件后的版本
- 删除除hello.java以外的其他三个文件
- 修改整合hello.java文件
- 重新提交解决冲突
配置多仓库与权限控制
配置多仓库
在实际项目开发中,我们可能会同时开发多个项目,那么我们如何进行多项目监管呢?
如果通过svnserve进行仓库监管,但是监管指令只能同时监管某一个文件夹,而不能同时监管多个仓库。
答:可以通过监管WebApp总目录来达到监管所有仓库的目的
svnserve -d(后台运行) -r(监管目录) WebApp(项目总目录的路径)
此时svn://localhost或ip地址 是来访问WebApp目录的,如果需要访问里面的Shop项目或者Wechat项目
Shop项目:svn://localhost/Shop
Webchat项目:svn://localhost/Wechat
权限控制
如果要使用权限控制功能,要有一个前提:必须首先开启权限功能,在每一个仓库中都有一个conf文件夹,里面有四个文件,其中
authz文件为授权文件,告诉哪些用户具有哪些权限
passwd文件为认证文件,标识当前svn系统中某个仓库具有哪些用户以及相应的密码
默认情况下,以上两个文件都是禁用的,如需使用,首先要在svnserve.conf配置文件上开启以上两个文件
开启步骤:
-
注释匿名用户的可读可写权限
给anon-access加上注释
### users have read and write access to the repository. # anon-access = write # auth-access = write
-
开启认证文件与授权文件
取消两个注释
password-db = passwd #一般在27行 authz-db = authz #一般在36行
-
编写认证文件定义相关用户名与密码
打开passwd文件,等号左边为用户名,右边为密码
[users] # harry = harryssecret # sally = sallyssecret admin = admin888 itcast = 123456
-
编写授权文件
打开authz文件
groups为用户分组
[aliases] # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average [groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe # 组名 = 组员(组员间用“,”隔开) admin = admin itcast = itcast # [/foo/bar] # harry = rw # &joe = r # * = # [repository:/baz/fuz] # @harry_and_sally = rw # * = r [Shop:/] #Shop为项目文件夹名 @admin = rw #r为可读,w为可写 @itcast = r * = r #代表匿名用户
-
测试
如果* = r时,所有用户都能Checkout到项目,但当要提交修改时,会出现用户验证
此时可以输入管理员账号admin admin888,或者普通员工账号itcast 123456
SVN服务的配置与管理
-
配置服务的自动启动服务(开机自启)
Window系统
创建系统服务
sc create 服务名称 binpath= "服务的可执行文件 --service -r WebApp的路径"start= auto(binpath=和start=后面都要带上一个空格)
sc create SVNService binpath= "svnservice安装目录\bin\svnserve.exe --service -r WebApp的路径" start= auto
-
配置批处理文件
Window系统(SVNService为服务名称)
-
创建stop.bat文件
net stop SVNService
-
start.bat文件
net start SVNService
-
delete.bat文件
sc delete SVNService
-
实际开发模拟
通过钩子程序,让svn服务器上的程序同步到web服务器
钩子程序
所谓钩子就是与一些版本库事件触发的程序,例如新修订版本的创建,或是未版本化属性的修改
默认情况下,钩子的子目录(版本仓库/hooks)中包含各种版本库钩子的模板
post-commit.tmpl:事务完成后所触发的钩子程序
钩子程序默认情况可以采用批处理指令或Shell指令来进行编写
通过批处理指令编写钩子程序
-
指定svn服务器工作目录
SET SVN="SVNService的安装目录\bin\svn.exe"
-
指定web服务器工作目录
SET DIR="服务器端目录"
-
通过update指令实时更新数据到DIR目录中
SVN update %DIR%
-
编写post-commit.bat文件(文件放在hooks文件夹内)
SET SVN="SVNService的安装目录\bin\svn.exe" SET DIR="服务器端目录" SVN update %DIR%
-
使用步骤
- 在服务器目录下通过svn服务更新项目
- 有人更新文件到svn服务器上,服务器上的文件也会更新