什么是 SVN
- SVN 全称 SubVersion
- SVN 是近年来崛起的版本管理工具,是 CVS 的接班人。目前,绝大多数软件公司都使用 SVN 作为代码版本管理软件。
特点
- 操作简单,入门容易
- 支持跨平台(Window/Linux/MacOS)
- 支持版本回退功能(时间机器)
获取 SVN 软件
属于 C/S 结构软件(客户端与服务器端)
服务端软件:VisualSVN
客户端软件:TortoiseSVN
点击下一步直至安装结束即可。
服务端配置
一、创建版本仓库
-
首先在 SVN 服务器端创建一个公有目录 WebApp 做为项目目录
-
在 WebApp 目录下创建 Shop 文件夹,做为 Shop(版本仓库)
-
创建版本仓库,基本语法:
svnadmin create Shop 文件夹路径(Shop 仓库)
如果 Shop 仓库配置成功,那么 Shop 文件夹会显示以下目录结构
二、启动服务端
基本语法: svnserve -d(后台运行) -r(监管目录) 版本仓库目录
通过以上指令,我们的 svn://localhost
或 ip 地址就可以直接指向 Shop 版本仓库
三、客户端连接
Apache http://localhost
或(ip 地址)访问到 htdocs 目录下的相关文件(监管)
SVN svn://localhost
或(ip 地址)访问到相关数据仓库(如 Shop 仓库)
- 如果有多个项目的话,
svnserve
可以启动项目的父目录,客户端连接的时候只需要带上项目的文件路径即可 - 如
http://localhost/Shop
四、权限控制
匿名用户权限控制
默认情况下,SVN 服务器是不允许匿名用户上传文件到服务器端的,所以必须更改系统相关配置文件。
更改第 19 行代码,去除前面的空格以及#号,更改其值为 write(可读写)
账号权限控制
-
关闭匿名用户权限控制
svnserve.conf
文件 -
开启
authz
文件和passwd
文件 -
编写
passwd
文件相关用户名与密码 -
编写
authz
授权文件-
设置 groups 组
-
给 groups 设置权限
组中如有多个用户用逗号分开,如:admin = admin,root
- r:可读
- w:可写
- *:其他所有用户
-
-
配置成功后重新拉取或提交文件需要用户登录
svn 客户端软件连接 SVN 服务器
1. Checkout 检出
首先在你的项目目录鼠标右键 TortoiseSVN 版本库浏览器输出 SVN 服务器地址:
svn://SVN 服务器地址 Shop 项目(仓库)
检出成功之后该目录下会多出一个.svn 隐藏文件,代表检出成功
TortoiseSVN图标集
常规图标
含义:当客户端文件与服务器端文件完全同步时,系统会显示以上图标
冲突图标
含义:当客户端提交的文件与服务器端数据有冲突,系统会显示以上图标
删除图标
含义:当服务端数据已删除,那么客户端该文件将显示以上图标
增加图标
含义:当我们编写文档已添加到提交队列,那么系统将自动显示以上图标
无版本控制图标
含义:当我们编写的文件没有添加到上传队列,系统将自动显示以上图标
修改图标
含义:当客户端文件有修改但未提交,此时将自动显示以上图标
只读图标
含义:当客户端文件以只读形式存在时,将自动显示以上图标
锁定图标
含义:当服务端数据已锁定,那么客户端文件将自动显示以上图标
忽略图标
含义:客户端文件已忽略,不需要进行提交上传,那么将自动显示以上图标
TortoiseSVN使用详解
(Checkout)检出操作
-
链接到SVN服务器端
-
拉取服务端数据到本地
注意:Checkout只在第一次链接时操作一次,以后如果进行更新操作请使用Update(更新指令)
(Commit)提交操作
将本地修改的代码提交到远程
(Update更新操作)
将远程修改的代码更新到本地
忽略功能
有些文件不希望上传至svn服务器,应该将该文件或该类型的文件添加至忽略列表
-
忽略某个指定的文件
-
忽略某类型文件
版本回退
有些时候,软件的运行可能使开发者或使用者不满意,这时我们需要把当前版本退回到以前的某个版本。
-
在项目空白处鼠标右键,采用如下图所示操作
-
根据日志或者版本号进行版本回退
-
根据日志信息选择要回退的状态,点击确定即可
版本冲突
在实际项目开发中,如果两个人同时修改某个文件就会产生版本冲突问题。
点击commit的时候发现如下错误,有冲突,禁止提交
解决方案
- update远程代码到本地
- index.php :整合后的index.php冲突文件
- index.php.mine :本地修改后的index.php文件
- index.php.r6 :index.php的起始文件(最初的)
- index.php.r7 :另外一位同事修改后的index.php文件
- 删除其他index.php文件,只保留整合后的index.php
- 打开index.php文件,手动将冲突解决
- 解决之后重新commit即可
svn 的常用命令
检出 checkout | co
从服务器拉取代码到本地
格式:svn co [svn 服务器 url] [检出本地的 path]
bash
svn co svn://47.106.183.193/helloworld ./
# svn在检出的时候可以指定用户名和密码
svn co svn://47.106.183.193/helloworld --username=xxx --password=yyy ./
添加 add
将新增加的文件加入版本控制体系
bash
svn add 文件名
提交 commit | ci
将本地变更的代码提交到 svn 服务器
格式:svn commit -m "xxx" [文件名]
bash
svn ci -m "第一次提交" hello.txt
提交完之后,会发现版本号自动增加了
更新 update | up
把服务器端文件所产生的所有修改下载到本地
bash
svn up
查看
bash
# 查看版本信息
svn log
# 查看文件状态
svn status
# 查看差异
svn diff
版本回退
-
还未提交
当我们想放弃对文件的修改,可以使用
svn revert
命令,将撤销任何文件或目录里的局部更改,revert
操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录需要携带-R
参数
bash
svn revert 文件名
svn revert -R 目录名
-
已经提交
对于已经提交的修改,我们需要使用
merge
命令进行回退,同时需要携带-r
参数
bash
svn merge -r 最新版本号:目标版本号 目录名或文件名
## 如:从版本100 回退到版本99
svn merge -r 100:99 目录名或文件名
冲突解决
当多人开发同一个文件时,我们进行commit
或者update
的时候,可能会发生冲突
发生冲突时,我们本地除了原文件会多出三个文件,总共四个文件
- xxx 文件:整合后的冲突文件
- xxx.mine 文件 :发生冲突时本地文件内容
- xxx.r[小版本号]文件 :发生冲突前文件内容
- xxx.r[大版本号]文件 :发生冲突时服务器端文件内容
我们只需要关注 xxx
文件,因为它本身就是整合后的冲突文件,只需要将该文件内的冲突解决完即可,其他三个文件可以删除掉。
将 xxx
文件内容冲突解决之后,执行svn ci
提交即可。