SVN版本控制服务

1. SVN概述

1.1 SVN简介

SVN是Subversion的简称,是一个开放源代码的版本控制系统,它采用了分支管理系统,设计目的就是取代CVS。

SVN是ASF(阿帕奇软件基金会)旗下的一款开源产品:

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工作流程:

  1. 从服务器下载项目组新代码
  2. 进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(如果想看看前一个小时修改了哪些代码,就需要这样做了)
  3. 下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。

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

原文地址:https://www.cnblogs.com/hgzero/p/12890928.html