1. SVN概述
1.1 SVN简介
SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,设计目的就是取代CVS。
SVN是ASF(阿帕奇软件基金会)旗下的一款开源产品:
- 官方网站:http://subversion.apache.org/
- Windows客户端 TortoiseSVN:http://tortoisesvn.net/
1.2 常见的版本控制软件
1.2.1 CVS
- 逐渐被SVN取代,是CVX的重写版和改写版。
1.2.2 SVN
- Subversion
1.2.3 Git
- 一个开源的分布式版本控制系统,可以有效、高效的进行项目版本管理
- Git 是 Linus为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
1.2.4 GitLab
- 利用 Ruby on Rails(一个开源的版本管理系统),实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
- 拥有与Github类似的功能,相当于是Git的加强版。
2. SVN工作原理
2.1 SVN存储数据的方式
- BDB(Berkeley DB):
- 一种事务安全型表类型
- FSFS:
- FSFS采用文件系统的方式,替代原来的基于Berkeley DB的实现
- 因为BDB方式在服务器中断时,有可能锁住数据,所以FSFS方式更安全一点
2.2 SVN的运行方式及端口
- 独立服务器
- 端口:3690
- 访问方式:SVN://
- C/S模式
- 借助Apache运行:
- 端口:80
- 访问方式:http://
2.3 SVN的工作流程
集中式代理管理的核心是服务器,所有开发者在开始新的一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。
所有的版本信息都放在服务器上,如果脱离的服务器,开发者基本上是无法工作的。
经典的SVN工作流程:
- 从服务器下载项目组新代码
- 进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(如果想看看前一个小时修改了哪些代码,就需要这样做了)
- 下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。
3. SVN作为单独服务器工作
3.1 概述
在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序,由源代码管理员统一管理这些源程序。
每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后开发人员可以在本地修改,然后用svn命令进行提交,由源代码库统一管理修改。
3.2 软件安装
- 直接yum安装即可
- subversion
- httpd
- mod_dav_svn
- subversion监听的端口
- 3690/tcp
- 3690/udp
3.3 版本库中的目录及文件详解
3.3.1 创建版本库
mkdir /webdept # 存放版本库的主目录
// 再创建两个版本库
svnadmin create /webdept/www.hgzerowzh.com
svnadmin create /webdept/my.hgzerowzh.com
// 查看版本库
ls /webdept/www.hgzerowzh.com/
3.3.2 版本库中的文件和目录
- dav目录
- 是提供apache与mod_dav_svn使用的目录,让他们存储内部数据,刚开始新建时此目录没有
- db目录:
- 所有版本控制的数据存放文件
- hooks目录:
- 放置hook脚本文件的目录
- locks目录:
- 用来放置subversion监控锁定数据的目录,用来追踪存取文件库的客户端
- format文件:
- 是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号
- conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)
3.3.3 conf目录中的配置文件详解
- authz:认证权限相关
- passwd:设置用户名和密码
- svnserve.conf:服务器配置文件
svnserve.conf 文件:
[general]
anon-access = read # 设置匿名用户可以读,使用none的话就是匿名用户不可以访问
auth-access = write # 认证用户可以写,可以是read,write,none
password-db = passwd # 密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库
authz-db = authz # 认证权限文件
realm = hgzerowzh.com # 登陆提示信息
# 注意:此配置文件的所有内容必须顶格,否则会报错
passwd 文件:
[users]
shit = shitpass
hehe = hehepass
tom = tompass
# 直接设置用户和密码即可
# 这里的密码都是明文,没有加密
authz 文件:
[groups] # 用户组设置
Check = shit,hehe # 定义组,和组中的成员,成员之间用逗号隔开,用户名必须是在passwd中存在的
[/] # /表示当前所在版本库目录,这里代表www.hgzerowzh.com
top = rw # 定义tom这个用户的权限
@Check = r # @Check表示这个组的权限,就是上面定义的组的成员
*= # 除了上面的有赋予权限成员之外,其他的成员都没有权限
//SVN目录格式:
// [/目录名]
// @用户组名 =权限
// 用户名 =权限
// *=
3.4 SVN 的启动
直接启动所有版本库,也可以选择启动指定的库
svnserve -d -r /webdept/
# -d 表示以daemon方式工作
# -r 表示指定工作根目录,启动所有的版本库
// 如果只需要启动某一个版本库,可以写成 -r /webdept/www.hgzerowzh.com
// 这样就表示只启动www.hgzerowzh.com这个版本库了
3.5 SVN的使用语法
3.5.1 使用格式
- svn [选项] 源码 svn://server_ip/项目名
3.5.2 常见的选项
import:将未版本化的文件纳入版本控制并提交
checkout:从版本库中检出一个修订版
update:更新工作拷贝
add,delete,copy,move:增、删、复制、移动文件或目录
status:检查状态差异
diff:检查文件行级详细差异
revert:恢复
resolve:解决冲突
switch:切换工作拷贝对应的版本库分支
log:查看历史记录
list:显示文件目录
cat:查看某个文件内容
3.6 SVN使用示例
3.6.1 将本地文件导入到SVN
[root@c7_node_03 ~]# mkdir work
[root@c7_node_03 ~]# cd work/
[root@c7_node_03 work]# touch 1.html 2.html
[root@c7_node_03 work]# cd
[root@c7_node_03 ~]# svn import /root/work/ file:///webdept/www.hgzerowzh.com/ -m "first edit"
Adding work/1.html
Adding work/2.html
Committed revision 1.
# 使用file,仅能在服务器本地导入
# -m 添加的注释,message
# 首次加入代码使用import选项,将未版本化的文件纳入版本控制并提交
3.6.2 代码取出
checkout 导出获得文件后,导出的文件仍处于SVN版本控制中,与版本库保持关联,比如可以进行svn update 或者 svn commit操作,checkout是第一次用,后面的用法就是更新。
svn checkout svn://10.0.0.203/www.hgzerowzh.com/ down_source
# checkout表示从版本库检出一个修订版,这里的down_source如果本地不存在则会自动创建
// 之后输入用户名和密码即可
3.6.3 代码添加
- commit选项:
- SVN的提交是将在工作空间做的修改进行提交,包括文件内容的修改,文件或目录的添加、删除、命名、移动等操作。
- 开发项目时,会在工作拷贝中修改项目的代码,然后总是要把修改之后做过的改动又存回到项目仓库中,这个过程称之为“提交”
- 提交是将对工作拷贝所作的所有改动发送并存储到中央项目仓库中。
- add选项
- 向文件拷贝所在的文件夹中添加新的文件,并作出标识,是新添加的,下一步提交时将一并提交到subversion版本库中。
- 简单的说就是将一新文件加入svn,添加再提交后该文件就进入subversion版本中去了。
// 在本地down_source目录中添加一些新文件
cd down_source
touch 3.html
echo shit >> 3.html
// 将新内容添加到SVN服务,并提交
svn add 3.html
svn commit -m "second edit"
4. SVN+Apache
4.1 SVN+Apache的基本工作原理
- SVN搭配Apache时,Apache需要使用mod_dav_svn这个模块
- mod_dav_svn:可以让版本库通过http协议实现网站展示
- 直接yum安装这个模块即可:yum install mod_dav_svn -y
- SVN+Apache需要密码验证支持,用htpasswd工具生成即可
4.2 配置Apache支持SVN
4.2.1 配置Apache
vim /etc/httpd/conf.d/subversion.conf
<Location /webdept>
DAV svn # 使用SVN模块
SVNParentPath /webdept # SVN的根目录
AuthType Basic # Basic的认证方式
AuthName "www.hgzerowzh.com website" # 认证提示信息
AuthUserFile /webdept/svn/passwd # 用户密码文件
AuthzSVNAccessFile /webdept/svn/authz # 访问控制权限文件
Require valid-user # 合法用户才能访问
</Location>
4.2.2 创建用户passwd文件
[root@c7_node_03 ~]# cd /webdept/
[root@c7_node_03 webdept]# mkdir svn
// 创建两个用户并设置密码
[root@c7_node_03 webdept]# htpasswd -c -m /webdept/svn/passwd hguser
New password:
Re-type new password:
Adding password for user hguser
[root@c7_node_03 webdept]# htpasswd -b -m /webdept/svn/passwd hguser2 hgzero2
Adding password for user hguser2
[root@c7_node_03 webdept]# cat /webdept/svn/passwd
hguser:$apr1$N025THp3$Qyvk75AplROVFu53fnldm/
hguser2:$apr1$q0qNVtcm$u6EHKtd6vJmC0/fJVj7XN/
4.2.3 创建权限authz文件
vim /webdept/svn/authz
[groups]
all = hguser,hguser2
[/] # 表示所有仓库的根目录下
#hgzero1 = rw
[www.hgzerowzh.com:/] # 表示www.hgzerowzh.com这个仓库所有用户都可读写
@all = rw
[my.hgzerowzh.com:/]
hguser = rw
hguser2 = rw
4.3 启动服务并测试
- 修改/webdept目录的属主和属组
- chown -R apache.apache /webdept
- 然后直接启动Apache
- 在浏览器键入 http://10.0.0.203/webdept/www.hgzerowzh.com/
- 然后在弹出的窗口键入用户名和密码即可访问
5. TortoiseSVN的使用
没什么好说的,大致流程如下
checkout --> 修改 --> add --> commit