天天看点

Subversion版本控制

Subversion版本控制

一、简介

二、svnserve

三、SSH+SVN

四、Apache+SVN

一、简介:

Subversion是一款自由开放的版本控制软件。Subversion可以管理文件、文件夹以及记录它们的修改状况。Subversion常用来帮助我们管理软件开发的源代码或是公司手册文档。

Subversion通过将文档导入至版本库中进行管理,版本库类似于文件服务器,但比文件服务器更强大的是它可以记录你每一次对文件或目录的修改状况,并提供还原数据至老版本的功能。

版本控制概念图:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/075908216.png"></a>

Subversion框架图:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/080009593.png"></a>

从图中可以看出服务端保存着Subversion版本库,客户端通过命令或图形界面连接服务端,并建立本地“工作拷贝”(从服务端将版本库中的资料拷贝至本地)。

客户端访问服务端时可以通过简单的svnserve访问、file本地访问、Apache间接访问。

1.svnserve是一个小巧、轻便的服务器程序,通过它客户端可以使用Subversion专有的协议进行访问,其特点是设置简单。

2.由于svnserve本身并不提供加密通讯的功能,所以如果你需要更安全的连接,可以使用svnserve+ssh的方式,通过连接SSH服务器建立在SSH隧道,在通过SSH调用svnserve程序。

3.Apache通过mod_dav_svn访问版本库,使得客户可以通过访问Apache取得版本库资料进行版本控制。

Subversion服务器对比图:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/080055695.png"></a>

二、svnserve示例(本文环境为CentOS6.2):

    1. 安装Subversion

    [root@centos6 ~]# yum -y install subversion

    2. 创建版本库

提示:这里计算机中提前有一个目录/shells,里面存放着公司的通用脚本,公司准备将其版本化。

    [root@centos6 ~]# mkdir /var/svn

    [root@centos6 ~]# svnadmin create /var/svn/project1

    //project1目录将自动创建,并初始化版本库,此时版本库无版本文件

    [root@centos6 ~]# svn import /shells  file:///var/svn/project1 -m "Initial DATA"

    //将shells目录中的文件导入版本库,使其版本化。-m后跟说明性字符串,可任意输入。

提示:这里file:///var/svn/project1即通过本地访问版本库,并导入数据至版本库。

    此时,版本库已经创建完成,并成功导入了我们的脚本文件(工作中你可以导入自己的任何文件)。但如果你需要访问版本库却仅可以通过本地file的方式访问,访问方法如下:

    [root@centos6 ~]# svn list file:///var/svn/project1/         //列出版本库中的文件列表

    [root@centos6 ~]# mkdir /test; cd  /test                     //创建本地拷贝目录

    [root@centos6 ~]# svn checkout file:///var/svn/project1    //将版本库中的文件拷贝至本机

提示:在本机保存一份本地拷贝后,以后即就当作普通文件对其进行修改,修改完成后随时可以上传回版本库,更新版本库。

      方法是:svn commit -m "Log"

    这里我们需要的是客户可以通过网络从远程访问版本库,如上所述方法可以有多种,我们先看第一种简单的svnserve方式。

    3. 启动svnserve服务的方式

    [root@centos6 ~]# svnserve -d

     //作为守护进程启动svnserve服务,默认监听端口3690,如果有防火墙注意防火墙设置

     svnserve运行后,会将所有的版本库发布至网络(如果有多个版本库的话)

     客户端需要指定据对路径访问版本库如svn://centos.example.com/var/svn/project1

    [root@centos6 ~]# svnserve -d -r /var/svn/project1      //限制仅发布project1一个版本库至网络

    客户端可以使用相对路径访问版本库如svn://centos.example.com/project1

    4. 认证与授权

    当客户端访问版本库时服务器会读取版本库中的conf/svnserve.conf中定义的认证与授权策略实现权限控制。

    [root@centos6 ~]# cat /var/svn/project1/conf/svnserve.conf

 ... 

[general] 

# anon-access = read            //匿名用户权限为只读,此处可以设置为none,read,write 

# auth-access = write           //经过认证的用户权限为可写 

# password-db = passwd          //指定用户存放用户名与密码的文件,该文件位于conf目录下名为passwd 

# authzauthz-db = authz         //指定基于版本库路径的访问控制(可以对文件或目录设置权限) 

# real = My First Repository    //设置版本库域,如果两个版本库的认证域相同,他们将使用相同的密码数据 

... 

提示:以上设置行默认全部为注释行,如果需要可以根据自己的需要去除注释。 

    下面我们来看看passwd与authz文件格式:

    [root@centos6 ~]# cat /var/svn/project1/conf/passwd

[users] 

# harry = harryssecret      //用户名为harry密码为harryssecret 

# sally = sallyssecret      //用户名为sally密码为sallyssecret 

提示:以上内容默认同样为注释行,如果需要可以去除#注释,或是添加自己的新用户与密码。 

    [root@centos6 ~]# cat /var/svn/project1/conf/authz

[groups] 

admins = harry,sally  //定义组,组成员有harry与sally 

[/]                   //对版本库根路径设置权限,可以设置为你需要控制的路径 

@admins = rw          //admins组中的用户用户可读,可写权限 

* = r                 //其他所有人只读,权限可以设置为只读('r'),读写('rw'),无权限('') 

   提示:如果你启动svnserve时通过-r指定了版本库,这是svnserve仅提供一个版本库给网络,对目录设置权限时可以不指定版本库的名称。

    如果你启动svnserve时为指定版本库,即svnserve提供多个版本库给网络,这是设置路径权限时需要指定版本库的名称。

    实例1:使用svnserve -d -r /var/svn/project1启动Subversion服务,

           如果需要指定目录设置权限路径应该为[/]或[/test],即这里的根(/)仅表示project1版本库,/test表示project1下的test目录。

    实例2:使用svnserve -d启动Subversion服务,即发布所有的版本库至网络,

           如果需要指定目录设置权限路径应该为[projet1:/]或[project2:/test],即这里的[project1:/]仅表示project1版本库的根,[project2:/test]表示project2下的test目录。

    5. 客户端访问:

    客户端我们使用Windows下的TortoiseSVN图形工具,可以在http://tortoisesvn.net/downloads.html网站下载该程序。

    效果如图:

<a target="_blank" href="http://blog.51cto.com/attachment/201208/081342882.png"></a>

<a target="_blank" href="http://blog.51cto.com/attachment/201208/081400554.png"></a>

三、SSH+SVN示例

    这种模式需要提前设置SSH服务,通过SSH服务调用SVN服务程序,所以svnserve不需要手动启动,客户端通过svn+ssh://centos.example.com/svn/project1访问。

    客户端程序通过ssh程序连接版本库主机,使用SSH认证(服务器系统用户名与密码),服务端接到某用户的ssh连接后会以该用户的身份启动svnserve。

    这种模式svnserve.conf还是可以进行权限控制的。

    1. 服务端启动SSH服务

    [root@centos6 ~]# service sshd start

    2. 服务端创建版本库

    3. 客户端访问效果如图:

    1)通过TortoiseSVN图形工具访问:

    2)通过命令行访问(一台rhel6.2系统)

    Apache是非常流行的Web服务器软件。它可以运行在几乎所有的计算机平台上。通过Apache发布Subversion的版本库,使得用户可以通过HTTP协议访问版本库。

    以下为使用Apache发布Subversion版本库的若干理由:

    1.Subversion可以使用Apache自身集成的多种认证方式。

    2.不需要创建系统用户。

    3.完善的Apache日志可。

    4.可以通过SSL加密网络传输的数据。

    5.HTTP(S)可以穿越企业防火墙。

    6.坚定地通过浏览器访问版本库。

    准备工作:安装Apache,加载mod_dav及mod_dav_svn模块,Apache需要这两个模块管理Subversion版本库。

    本文以yum方式安装这些软件,环境为CentOS6.2。

    [root@centos6 ~]# yum -y install httpd

    [root@centos6 ~]# yum -y install mod_dav_svn

    安装完成后你可以通过以下方法查看dav模块是否加载成功:

    vim /etc/httpd/conf/httpd.conf

    查看是否包含LoadModule dav_module modules/mod_dav.so

    vim /etc/httpd/conf.d/subversion.conf

    查看是否包含LoadModule dav_svn_module modules/mod_dav_svn.so

    如果你还需要Subversion自带的基于目录的权限控制的话,可以通过加载mod_authz_svn实现。

    接下来通过修改Apache配置文件实现网络化版本库:

    root@centos6 ~]# mkdir /var/svn

    [root@centos6 ~]# vim /etc/httpd/conf.d/subversion.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so     //加载模块 

LoadModule authz_svn_module   modules/mod_authz_svn.so //加载模块 

#                                                     //#符号开头的为注释行 

#   a) readable and writable by the 'apache' user, and

# //默认Apache启动用户为apache,所以需要apache用户对版本库有读写权限

#   b) labelled with the 'httpd_sys_content_t' context if using

#   SELinux 

# //如果开启了SELinux版本库需要有httpd_sys_content_t这样的安全上下文

# To create a new repository "http://localhost/repos/stuff" using 

# this configuration, run as root: 

#   # cd /var/www/svn 

#   # svnadmin create stuff   

#   # chown -R apache.apache stuff 

#   # chcon -R -t httpd_sys_content_t stuff     //以上注释行是配置文档提供的操作示例 

                                               //注意我们的版本库在/var/svn目录下 

&lt;Location /svn&gt;                         //Location可以根据特定的URL执行特定的处理 

//这里当用户的RUL以/svn开始时,将控制权交于DAV处理(http://hostname/svn/...) 

   DAV svn 

   SVNParentPath /var/svn               //通过SVNParentPath指定所有版本库的主目录(发布所有版本库) 

                                        //也可以通过SVNPath指定某个特定版本库的路径(发布特定版本库) 

      AuthType Basic                    //认证方式 

      AuthName "Please Input passwod"  //提示字符 

      AuthUserFile /var/svn/.pass       //帐号文件的路径,为了安全隐藏该文件 

      Require valid-user                //指定仅有效用户可以访问 

&lt;/Location&gt; 

    [root@centos6 ~]# chown -R apache.apache  /var/svn/                //修改权限

    [root@centos6 ~]# chcon -R -t httpd_sys_content_t  /var/svn   //仅在SELinux开启时使用

    [root@centos6 ~]# htpasswd -c /var/svn/.pass  jerry        //创建帐号文件,并添加用户jerry

    [root@centos6 ~]# service httpd start

    客户端访问效果如图:

本文转自丁丁历险51CTO博客,原文链接: http://blog.51cto.com/manual/961815,如需转载请自行联系原作者

继续阅读