一、SVN概述
SVN(全称subVersion) ,又叫版本控制软件。使用SVN可以多人协作开发:如张三、李四各自负责不同的模块;远程开发:如张三、李四在不同的城市一起负责统一项目的开发;版本回退:如项目迭代后发现还是原来的版本更欢迎,于是乎回退到原来的版本 。
如果张三、李四两个人对同一个项目代码进行了改动,SVN会对两个人修改部分进行合并,如果都是修改的同一行,SVN 会提示文件 Conflict 冲突,需要手动确认。
SVN属于C/S结构软件(客户端/服务端)
服务端软件:VisualSVN https://www.visualsvn.com/
客户端软件:Tortoisesvn https://www.visualsvn.com/visualsvn/download/#tortoisesvn
特点:
- 操作简单,容易入门
- 至此跨平台操作,如Windows、Linux、MacOS
- 支持版本回退功能
二、SVN服务器软件配置
注意:安装完SVN软件之后要重启电脑,否则SVN图标是无法显示的
1. 创建一个项目
1.1 在SVN服务器创建一个共有目录WebApp做为中央仓库(也可以自定义目录位置),用于保存历史版本数据。
1.2 在WebApp目录下创建Shop文件夹,做为Shop项目的版本仓库,一个项目就是一个版本仓库,现在Shop是空的。
1.3 创建版本仓库,Dos环境基本语法:
svnadmin create Shop 文件夹路径(Shop仓库)
如果成功了,在Shop文件夹中会出现以下文件
2. 服务端监管
服务端 :Apache -------> ip地址访问到htdocs目录下的相关文件(监管)
客户端:SVN ------------> ip 地址访问到相关数据仓库(如刚才自定义的Shop仓库)
启动svn服务监管:
svnserve -d -r 版本仓库路径
不要急着关闭该dos窗口,否则会视为终端监管。通过以上指令,我们的ip地址就指向了Shop版本仓库。
3. 权限控制
默认情况,SVN服务器是不允许匿名用户上传文件到服务器,所以需要更改项目的相关配置文件。
匿名访问:
anon-access = read 匿名登录下只读权限(只能从服务器下载,不能将文件上传至服务器)
anon-access = write 匿名登录下可读可写
anon-access = none 禁止匿名用户访问
已验证访问:
auth-access=read注释打开(通过验证的用户只读)auth-access=write 注释打开(通过验证的用户可读可写)
password-db=passwd 注释打开(表示授权人的用户名和密码 存放在passwd文件)
authz-db=authz 注释打开(表示权限管理文件是 authz),如果我们要对整个工程的文件进行权限分配,就必须把这个注释解开,否则在无论配置什么权限都无效
将 conf文件夹下的svnserve.conf做下小小权限修改,去除#和空格,把anon-access = read 改成 anon-access = write。一定要去掉空格,否则在客户端登录会出现"Section header must start in the first column的"的警告!
三、客户端与SVN服务器连接
新建一个文件夹(ceshi),进入到项目目录(ceshi)鼠标右键----> TortoiseSVN------->版本库浏览器(repo-browser) ------->输入SVN服务器地址: svn://SVN服务器地址 (本地:svn://localhost) -------> Shop仓库
我这里是在本地测试
之后回到之前的项目文件夹,将电脑设置为“显示隐藏的文件夹”,会发现有个灰色的文件夹,此时说明与服务器建立了连接。
回退到上一级目录,发现文件夹有个绿色的对勾,说明检出成功,可以同步数据了。
如果第一次检出成功,在空白处右键会发现“更新”、“提交”两个选项,否则是”检出“选项。如下是检出成功和未检出的区别。
注意:只要在第一次连接时checkout一次,后续要更新使用update操作
未检出如下图
四、SVN使用详解
4.1 新增
按照上面步骤客户端与服务器连接成功后,就可以上传文件了
显示如下说明成功了 ,回到刚才的项目文件夹中,发现刚才提交的文件前面出现了绿色的对勾
上述操作一般是项目经理操作的。此时作为程序员,需要将项目经理上传的SVN服务器的文件拉下来为开发做准备。首先我们同样建立一个文件夹(lisi),并将该文件夹与SVN服务器建立连接,操作步骤同上,需要对其进行一次检出操作。
1. 检出操作,连接到SVN服务器后,发现项目经理上传的文件引入眼帘,我们把它checkout到我们本地文件夹(lisi)中。
成功后发现lisi文件夹也有了文件
lisi把今天的任务完成了,需要将login.html上传到SVN服务器上,只需要单击”提交“指令即可,
4.2 更新
这时lisi的文件夹中的login.html文件夹就上传了,如果项目经理要查看最新的项目进度,需要从SVN服务器中更新一份最新的文件。我们到ceshi文件夹中,空白右键 update
4.3 忽略
如果需要忽略某些文件,需要选中该文件右键,然后按照下图步骤即可忽略。提交文件的时候该文件就不会显示出来了。如果需要取消,按照同样的步骤即可移除。
4.4 版本回退
传统的存储机制是每一次版本都要存储起来,那么没有修改的文件也会随之版本的变化而存储,这样是非常消耗内存的。SVN的存储机制是每一次只存储修改部分的数据。
版本回退操作如下
我先将ceshi文件夹中的”新建位图图像.bmp“文件删除后,提交到SVN仓库,之后在利用版本回退到删除之前。
1. 删除后提交
我们根据日志回退,点击 Show log显示日志,会弹出一个弹出框,选择需要回退到的版本后点击ok
4.5 撤销本地修改内容
本地内容已修改,但未提交的情况,想要恢复至上一个版本(上个版本:最后一次提交到云端服务器的版本),可以右键目标文件选择 “TortoiseSVN------>Revert” 或者 选择“commit-----> 右键目标文件-------->Revert”
方式1
方式2
4.6 撤销已提交内容
如果不小心把错误的版本提交到了版本库中,可以选择“TortoiseSVN---->show log----->右键目标文件-----> Revert changes from this version”。此时仅恢复了本地文件的修改,需要重新提交文件才能将版本库中的错误版本覆盖。
4.7 版本冲突
首先我们把ceshi、lisi的文件夹都更新一份最新的。然后在ceshi文件夹中修改”需求分析“.txt,并输入一段内容后提交。
随后我们在lisi文件夹中修改同样的文件,并输入一段内容后提交发现出错了。
回到lisi的文件夹,发现多了几个文件
- 需求分析.txt 是SVN整合后的文件
- 需求分析.txt.mine 是lisi修改后的文件
- 需求分析.txt.r6: 是ceshi第一次更新的文件, rx: 其中x越小代表越早更新
- 需求分析.txt.r7: 是lisi第一次更新的文件
解决办法
- 删除SVN整合以后之外的文件,只需要保留”需求分析.txt”即可。
- 修改SVN整合以后的文件
- 重新提交
4.6 分支
分支作用:创建分支就是创建文件夹将项目copy一份,使用多个分支同时推进不同功能开发,各分支之间互不干扰。
trunk(主干)、 branches(分支)、 tags(标签:存放开发过程中开发好某个节点的代码,即每开发好一个小功能可放在tags中) , 这三个目录可自行创建,也可在新建项目时自动创建。
现在我们在svn服务器上重新创建一个新文件夹Mold做为项目, 进入到Mold文件夹中,在空白处右键----> TortoiseSVN------> Create repository here
可以在创建版本仓库的时候自动创建分支结构,现在我们先试试自己手动创建的方式,故直接单击ok。
完成之后会发现在Mold文件夹中多出了很多个文件,如下
对Mold版本仓库进行监管,打开DOS管理员命令窗口 , 将Mold文件夹的绝对路径复制下来,在DOS命令窗口中输入 svnserve -d -r Mold的绝对地址
在你的工作目录中创建一个开发项目文件夹myProject, 进入该文件夹,在空白处右键-->TortoiseSVN---->Repo-browser----->弹出URL对话框,输入SVN服务器地址: svn://SVN服务器地址 (本地:svn://localhost) -------> Shop仓库
最终会弹出一个窗口,在空白处右键checkout,选择检出地址(对应我们创建的项目文件夹myPorject), 自己创建的项目文件就和svn服务器建立连接了
进入到myPorject项目文件夹,发现有个灰色的文件夹.svn(表示隐藏的),这也说明了本地与svn服务器建立了连接。
根据情况而定设置权限,详细配置移步至第二章节及第五章节权限模块,这里我为了测试设置匿名账户可读写操作。
手动创建trunk、branches、tags三个目录,并提交至版本仓库。如果是刚建版本仓库时选择create folder structure,则svn会在项目文件夹myProject中自动创建这三个目录并关联版本仓库,但是需要在项目文件夹myProject检出操作。
提交之后文件夹会出现绿色小对勾,和自动创建的简直是一模一样。
现在模拟开发,我们在trunk(主干)中创建一个文件day1.txt文件并提交,然后再次创建另一个文件 day2.txt作为第二天的开发,这两次都是分别提交的。打开日志我们发现一共有三次记录,分别是创建分支文件夹、提交day1.txt文件、提交day2.txt文件
现在接到客户需求,需要在day1.txt文件中新添加一个小功能,但是day2.txt的功能和day1又有关联,于是乎开始创建分支,A组开发客户新需求,B组完成后续的开发,这样就不会影响开发进度了。
然后进入到branches文件夹,发现文件夹中空空如也,原来是没有update操作,update之后发现分支已经创建好了。
4.6.1 主干代码到分支
B组在trunk文件夹day2.txt文件做了内容修改,需要同步到分支中,怎么操作呢?首先在trunk文件夹commit操作,然后到branches文件夹依次操作 TortoiseSVN ------> Merge
因为是要从主干同步到分支,所以地址填写主干的,然后勾选all revisions全部修改,也可以更新指定的修改(specific range),完了点击Next。
直接选择Merge
回到branches文件夹中的day2.txt,发现和主干的内容同步了。但在day2.txt中会出现红色感叹号,是因为没有commit到版本库的原因。
4.6.2 分支代码合并到主干
修改branches文件夹day1.txt文件,commit后备份一份,通过测试后就可以合并到主干上了。回到trunk文件夹,将最后一次做的修改commit后就可以对baranches的内容合并了。
首先进入到trunk文件夹,然后鼠标右键主干文件夹,依次选择TortoiseSVN ------> Merge ,和将主干代码同步到分支的步骤是一样的,不同的是URL to merge from的路径是分支branch的路径(源路径),后面的操作就一样了。
4.6.3 删除分支
选择目标branch。右键TortoiseSVN--> Delete。
4.7 暂存
作用:代码没完成,有不能提交到版本库中的情况下就需要用到暂存了。
4.7.1 暂存代码
在trunk文件夹中的day2.txt代码没写完,但此时需要解决一个紧急bug,只能将手下工作放下,选中项目,选择“TortoiseSVN”→“存储.(Shelve...)”,然后选择需要暂存的文件,之后对本地文件的修改是否保留做选择。
注意: 将本地文件撤销指的是撤销距上一次提交至版本库之间做出的修改内容,即恢复到最后一次提交至版本库的版本状态
4.7.2 取出暂存代码
右键目标项目文件夹,选择“TortoiseSVN”→“取消贮藏...(UnShelve...)”,svn根据名称选择对应的暂存,同一个名称的暂存,按照时间排序会有不同的版本,根据需要选择对应的版本,然后单击“应用(Apply)”,即可将本地的文件同步为暂存版本
4.8 图标库
鼠标右键空白处点击tortoiseSVN ------> 点击 setting(设置),在弹出层中找到图标 icon 即可查看
五、SVN多仓库配置及权限配置
5.1 多仓库配置
我们有可能会有多个项目同时在进行,但是svnserve指令只能监管某一个文件夹,也就是一个项目。此时我们可以通过监管这些项目的根目录,如有个文件夹WebApp,里面有两个项目为Shop和Mold,只需要监管root文件夹就好了。
输入如下指令: svnserve -d(后台运行) -r (监管目录) WebApp的路径
svnserve -d -r D:\wei\software\VisualSVNServer\WebApp
如果需要访问Shop项目或则Mold项目怎么办呢?直接连接到具体的项目中,svn:// ip地址/Shop,在本地则可以将ip地址换成localhost
Shop项目: svn://localhost/Shop
Mold项目: svn://localhost/Mold
5.2 权限配置
想要使用权限就必须要开启权限功能。在每个项目仓库中都有一个conf文件夹
authz文件: 授权文件,告诉SVN服务器哪些用户有哪些权限
passwd文件: 认证文件,标识当前svn系统中某个仓库具有哪些用户及相应的密码
默认情况,以上两个文件是禁用的,如果要使用,需要在svnserve.conf配置文件中开启
1. 注释匿名用户的可读写权限
2. 开启认证文件和授权文件,将下面两个文件取消注释
3. 编写认证文件,定义相关用户名和密码
3.1 打开passwd文件,如下添加了admin和zhangsan两个用户, 形式是: key = value 左边是用户名, 右边是密码。
3.2 在autoz文件中,给用户分组, 形式为 key = value1, value2 …… value n , 等号左边是组名,右边是用户名
3.3 编写授权文件, r: 读 , w: 写, [ ] 里面的是路径名
上述步骤做完就设置好了权限,接下来我们可以测试了。
我们再建一个文件夹为wangwu, 连接SVN服务器将项目checkout,发现匿名用户是可以成功检出的。
接下来我们再将需求分析上添加一段内容并提交,发现弹出了一登录框要求验证,说明配置成功了。
权限解读
autoz文件
[Shop:/]
@manger = rw // 表示 manger组下的成员可以对Shop文件有读写权限
@admin= rw // 表示 admin 组下的成员可以对Shop文件有读写权限
[Shop:/A]
@userr= r // 表示 userr 组下的成员可以对Shop文件夹下的A文件夹有读写权限
*= // 表示 其它用户没有权限(看不见这个目录)
5.3 权限规则
1.路径上 配置过权限的用户,无论在父目录有无设置权限,对该路径都有权限。
2. 对同一条路径配置多次权限,会合并所有配置,如果相同用户在同一路径有多个配置,会以最后的为准。
配置1:
[Shop:/A]
userr1 = rw
userr2 = rw
配置2
[Shop:/A]
userr1 = r
* = r
等价于
[Shop:/A]
userr1 = r
userr2 = rw
* = r
3. 如果路径配置包含 * = r / w / rw, 在该路径中最低权限是 r / w / rw , (即使有配置过用户权限为空,如: usere = )
[Shop:/A]
userr1 =
usere2 = rw
* = r
等价于
[Shop:/A]
userr1 = r
userr2 = rw
* = r
tips: * = '权限' 会覆盖比它更低的权限,如 * = '权限' 会覆盖 * = 的权限
4. 如果路径的配置(不考虑多次配置)没有 * = r / rw, 该路径对继承父目录的权限
配置1
[Shop:/A]
userr1 = r
* =
配置2
[Shop:/A]
userr2 = rw
等价于
[Shop:/A]
userr1 = r
userr2 = rw
* =
六、服务配置与管理
6.1 自启动服务
因为SVN服务器是监管仓库是要通过DOS命令窗口执行 ” svnserve -d -r 仓库地址 “ 的。假如服务器重启了,那么这个DOS窗口必然是关闭了的,如何实现自启动呢?我们可利用windows相关指令把监管指令追加到系统服务中,这样就可以随着windows打开而打开了。
1. 配置自启动服务
sc create 服务名称(这里叫什么系统就显示什么) binpath=空格 "svn服务器bin目录\svnserve.exe 空格--service -r 监管的大仓库地址" start=空格 atuto
sc create SVNService binpath= "D:\wei\software\VisualSVNServer\bin\svnserve.exe --service -r D:\wei\software\VisualSVNServer\WebApp" start= auto
1. 输入cmd, 打开DOS命令窗口(需要打开管理员权限运行窗口)
2. 查看系统服务 ,控制面板---->系统和安全-----> 管理工具 ------->服务,找到刚才命名的服务点击"启动", 如果运行成功代表开启了SVN监管服务
6.2 创建批处理文件
6.2.1 启动
net start 服务名
创建一个记事板,输入指令 net start SVNService,保存后修改记事本文件名为start.bat,双击运行即可。
6.2.2 停止
net stop 服务名
创建一个记事板,输入指令 net stop SVNService,保存后修改记事本文件名为stop.bat,双击运行即可。
6.2.3 删除
sc delete 服务命
创建一个记事板,输入指令 net stop SVNService,保存后修改记事本文件名为stop.bat,双击运行即可。
七、自动更新
在开发过程中,每更新一次版本就要将最新的版本提交到SVN服务器中,最后由项目总负责人将最新版本更新到Web服务器中,如果更新过于频繁,项目负责人可就不好过咯。怎么解决呢?在SVN中有个钩子函数可以为项目负责人减轻负担。
每个版本仓库中都有个hooks文件夹,里面包含了各个版本库钩子子模块
post-commit.tmpl: 事务完成后所触发的钩子程序
钩子程序默认情况下可以采用批处理指令或Shell指令进行编写
通过批处理指令编写钩子程序
指定svn服务端工作目录
- 设置服务器端SVN路径
SET SVN = “D:\wei\software\VisualSVNServer\bin\svn.exe”
- 指定web服务器工作目录
SET DIR="D:\server\apache\htdocs\shop"
- 通过update指令实时更新数据到DIR目录中
SVN update %DIR%
具体操作步骤
- 复制post-commit.tmpl为post-commit.bat文件,清空post-commit.bat文件内容
- 填入上述3条相关批处理指令
- 在 WebApp目录(中央仓库)创建 Shop 项目并更新SVN服务端数到本地
- 更新文件到SVN服务器端,可以在Shop目录实时获取到最新数据
- 可以通过虚拟主机形式直接访问更新文件
八、扩展
1. 什么是BAE云引擎
百度应用引擎(BAE) 是百度推出的网络开发平台。基于BAE架构,使开发者不需要维护任何服务器,只需要简单的上传应用程序,就可以为用户提供服务。
2. 如何使用BAE云引擎
BAE地址: http://bce.baidu.com/