你的位置:首页 > 操作系统

[操作系统]SVN版本控制服务

1》Subversion版本控制简介:

             Subversion(SVN)是一款自由开放的版本控制软件,可以管理文件,文件夹以及记录他们的修改状况,常用来帮助我们管理软件开发的源代码或是公司手册文档。SVN通过将文档导入至版本库中进行管理,版本库类似于文件服务器,但比文件服务器更强大的是,它可以记录用户每一次对文件或目录的修改状况,并提供还原数据至老版本的功能;版本控制对于软件开发而言是至关重要的,现在的软件开发一般作为项目进行,一个项目中会有很多人参加,那么每个人手中都有自己的一份修改备份,最后谁的版本是最新的?有时一款软件开发出来之后会有很多个版本,比如1.0版本,2.0版本,而且每个大版本下还有小版本号,1.1.1,2.1.1,等版本,SVN可以帮助我们很好地管理这些代码;

2》SVN架构图:

            从下图可以看出,服务器端保存着Subversion的版本库,客户端通过命令或图形工具连接到服务器,并建立本地“工作副本”,也就是从服务器端将版本库中的资料复制到客户端本地,当然,客户端主机可以将自己本地的版本更新至服务器版本库,而客户端可以通过三种方式连接到服务器取得版本库中的数据:

                                                                         版本库(Svn   Repository)---------------------->服务器端

                                                            ========================================================

                                                                          Apache

                       mod_dav                                          SVN

                       mod_dav_suv

                                                     

                                                                               Internet

                     --------------------------------------------------------------------------------------------------

                                                                                  DAV             SVN               Local

                                                                                                 版本库访问       

                                                          ===========================================================

                                                                                    命令行或图形工具------------------------------》客户端

3》Subversion服务器:

                    客户端访问服务器时可以通过三种方式访问:svnserve访问,svnserve+ssh访问,Apache间接访问;

      svnserve是一个小巧,轻便的服务器程序,客户端通过使用SVN专用的协议进行访问,其特点是简单;由于svnserve本身并不提供数据加密通信的功能,所以,如果需要更加安全的连接,可以使用svnserve+ssh的方式与服务器建立SSH隧道连接,再通过SSH调用svnserve程序,实现数据的安全加密传输;Apache通过mod_dav_svn模块可以访问版本库,这样客户端可以通过访问Apache取得版本库资料,从而完成对数据的版本控制;

*************

                                   Apache+DAV                                                   svnserve                                                   svnserve+SSH

认证                     HTTP基本认证,LDAP,证书          支持MD5认证                                                      SSH认证

权限           可对版本库整体设置权限,也可对        可对版本库整体设置权限,也可对               仅对版本库 整体设置权限

        指定目录设置权限                指定目录设置权限

加密      支持SSL加密               无                   支持SSH隧道加密  

日志      完善的Apache日志              无                   无   

速度      慢                    快                   快   

设置      相对复杂                 简单                   相对简单

4》SVN服务器搭建:

         1>安装SVN软件:

      yum  -y  install  subversion

   2>搭建服务器:

                        版本库软件安装完成以后,我们首先要做的是创建一个版本库,svnadmin工具是SVN软件所提供的版本库管理工具,该工具可以用来创建库,备                 份库,修订版本等操作;其次我们还需要为版本库建立一套有效的认证机制以增强版本数据库的安全性,最后当服务器端的所有设置均完成后,启动                  服务器端相应的服务进程即可;

                1)创建服务器版本库:

          利用svnadmin命令可以创建服务器版本库;

       描述:subversion版本库管理工具,通过svnadmin help可以查看命令帮助;

       用法:svnadmin    命令   /版本库路径【选项】

                        命令:

          create            创建一个新的版本库

          hotcopy   版本库热备

          lslocks     打印所有的锁描述

       svnadmin实例:

                              svnadmin     create  /var/svn/project1

          svnadmin    hotcopy   /var/svn/project1        /var/svn/projet1_copy

          svnadmin    lslocks  /var/svn/project1

         ABC公司近期刚刚接到一个网站项目,由于项目开发是多人进行的,所以公司希望使用版本控制系统高效地管理项目代码,项目代码保存                            在/var/web_code目录下,下面我们将为该项目创建名为web_project的版本库:

                              mkdir   /var/svn

          svnadmin   create   /var/svn/web_project

                             通过svnadmin命令已经创建了一个名为web_project的空版本库,下面我们将使用svn命令将项目代码导入到版本库中,import代表执行导入操                       作,将本地web_code目录下的资料导入到刚刚创建的空版本库web_project中,-m后面跟的是说明性的字符串,可以为任意字符:

                             svn  import  /var/web_code/  file:///var/svn/web_project/  -m  "Initial  DaTa"

         svn  list  file:///var/svn/web_project           列出版本库中的资料列表

                                    

                      2)认证与授权

                                     使用SVN内置的认证机制可以有效地增强客户端访问版本库的安全性,当客户端访问版本库服务器时,服务器会根据版本库目录下的                                     conf/svnserve.conf文件中定义的认证与授权策略实现权限的控制,下面是该文件的核心配置说明:

                   

                                    在svnserve.conf中已经配置好了账户密码文件,下面分别看看passwd与authz文件的内容,默认该文件存放在版本库的conf目录下,在                           passwd文件中需要设置账户信息,在authz文件中需要设置访问控制权限;       

                             

                       

                             3)启动svnserve服务:

                                    svnserve命令的描述和用法如下:

                                    描述:SVN服务器程序

           用法:svnserve [选项]

                                    选项:

              -d                     以守护进程方式运行svnserve

             --listen-port=port     指定监听的端口,默认监听端口号为3690

            -r         为版本库指定一个虚拟路径,默认客户端要指定绝对路径访问库

                                   直接运行svnserve命令即可启动SVN服务进程,但如果需要该服务作为后台程序持续监听客户端访问,可以使用-d选项使该程序以守护进                         程的方式启动svnserve服务,SVN服务默认监听端口为3690,如果防火墙处于开启状态,需要注意对防火墙的正确设置;svnserve运行后,会将                         所有版本库发布至网络(假设有多个版本库);此时,客户端需要指定绝对路径访问版本库,如;svn://centos.example.com/var/svn/web_project,                       同时服务器端如果需要在authz文件中为目录设置权限,路径应该为[web_project:/]或[project2:/test],即这里的[web_project:/]表示web_project是版                       本库的根,[project2:/test]表示project2下的test目录;   

                                    默认SVN会将服务器计算机中所有的版本库共享给网络用户,但有时我们仅希望发布其中一个版本库时,就需要限制仅发布web_project                         一个版本到网络中,这样客户端也可以使用相对路径访问版本库,如:svn://centos.example.com/web_project(客户端会访问服务/var/svn/目录下                     的web_project项目),同时,服务器端如果需要在authz文件中为目录设置权限,路径应该为[/]或[/test],即这里的根(/)仅表示web_project版本                          库,/test表示web_project下的test目录;如果需要发布个别版本库给网络用户,可以使用svnserve 命令的-r 选项,该选项后面接版本库的路径:

                                          svnserve  -d  -r  /var/svn

                                            

                       4)客户端访问:

                                  版本库服务器创建完成后,我们可以通过多种方式访问SVN服务器的版本库,可以使用命令行或者图形工具,也可以通过本地磁盘或网络                                协议访问,但不管你使用哪种方式,都需要提供一个URL地址来定位版本库的位置,每种URL的使用格式及含义示下:

                        file:///                   直接访问本地磁盘上的版本库(客户端与服务器端在一台机器上)

               配置Apache的WebDAV协议,通过网页访问版本库

         https://                 svn://        通过svnserve定义的协议访问版本库

         svn+ssh://    与svn://相似,但使用了SSH封装加密数据

          在客户端访问服务器版本库的众多方法中,命令行的方式是高效,功能完善,无须安装第三方软件的一种简单方式,SVN软件为我们提供                           了一个名为svn的命令行程序; 

                              (1)svn命令:

              描述:subversion客户端命令行工具

              用法:svn  命令  【选项】

              选项:

              --password         密码

              --username    用户名

              --revision(-r)  指定要检查的特定版本

           命令:

               add                    添加文件,目录或符合链接

               cat       输出特定文件的内容

               checkout     URL[@REV] [PATH]

                                    从服务器版本库中复制一份副本到本地,URL定位版本库,通过REV可以下载特定版本的数据,PATH为本地工作副本路径:

                                                  commit                将本地工作副本修改后的内容发布至版本中,简写为ci

               copy    SRC    DST       将工作副本中的一个文件或目录复制到版本库中

               delete    PATH               从本地工作副本中删除一个项目

               delete    URL       从版本库中删除一个项目

               diff          对比两个版本之间的差别

               import          提交一个路径的副本至版本库中

               info         显示本地或远程版本信息

 

        svn实例:

                                       svn   checkout   file:///var/svn/project1   mine

           svn    co   svn://192.168.0.254/project1  mine

           svn    commit  -m   "modified  foo.html"

             svn     commit  -m   "modified  foo.html"   /mine

             svn     delete   testfile

             svn      diff

           svn   import  -m  "New  project"   /etc    file:///var/svn/project

           svn  info

              svn  info   svn://172.16.0.118/var/svn/web_project

                                除了核心的svn命令,SVN软件包还提供了一个用于对版本库数据信息进行简单查询的工具,svnlook命令可以帮助用户完成这些查询工作;

                              (2)svnlook命令

                   描述:subversion检查工具,通过svnlook  help可以查看命令帮助;

           用法:svnlook 命令     /版本库路径    【选项】

             选项:--revision(-r)   指定要检查的特定版本

             命令:

             author                        显示作者

             cat         显示版本库中的文件内容

               date        显示时间标记

               log           显示日志消息

               tree          显示版本库资料树

                                 svnlook实例:

                                           svnlook   author  /var/svn/web_project

                                           svnlook  author  -r  2  /var/svn/web_project     查看版本2的作者信息

            svnlook  cat    /var/svn/web_project  a.text   查看版本库中a.text文件的内容

                                                    

                                        我们可以使用svn命令或图形工具连接版本库服务器,下载版本数据到本地,通过图形方式在本地计算机生成本地副本版本,图形工具                            选的是windows平台的TortoiseSVN软件,安装完成该软件后,在桌面点击鼠标右键即可找到该工具,它是免费的基于GPL开发的开源自由软                                件,它是subversion版本控制系统的一个非常优秀的客户端程序,可以帮助我们高效地管理文件与目录,我们可以                              上找到下载链接,该软件还提供了多语言软件包(包括中文);

                           

5》svnserve+SSH服务器搭建:

                  由于svnserve并不支持加密,所以对公司的数据安全危害比较大,基于SSH的svnserve使得客户端可以通过SSH服务调用SVN服务程序,客户端需要          使用ssh程序连接远程服务器的SSHD服务,通过SSH认证机制验证账户身份后,再自动启动svnserve服务,所以服务器端不需要提前启动SVN服务;在这            种模式下,svnserve.conf配置文件依然可以进行权限控制,服务器部署流程是启动SSH服务,在服务器上创建版本库,向版本库中导入数据,最后客户端            使用命令或图形方式访问服务器,具体操作步骤如下:                       

        1>服务器端启动SSHD服务器:

                      service     sshd    start                                     

            chkconfig   sshd  on 

    2>服务器端创建版本库:

                      svnadmin    create   /var/svn/web_project2

       svn   import   /var/cofe2     file:///var/svn/web_project2  -m  "Web  code"

             3>客户端访问:

                    svn  co   svn+ssh://172.16.0.118/var/svn/web_project2   /web_code2

6》Apache+SVN服务器搭建:

                 虽然前面两种服务器类型已经可以满足大多数人的使用需求,但当客户端没有任何工具可以使用时,我们还可以创建基于Apache的SVN服务器,这样          客户端只要有浏览器,就可以访问版本库服务器,Apache是目前非常流行的Web服务器软件,它允许在几乎所有的计算机平台上运行,目前绝大多数系统          平台都可以部署Apache  Web  Server,使用它访问版本库需要加载mod_dav与mod_dav_svn模块,Apache需要通过这两个模块才可以管理subversion版            本库,使用Apache发布subversion版本库的好处有:  

                 subversion可以使用Apache的多种认证方式;

     不需要创建系统账户;

     Apache提供了完善的日志功能;

            可以通过TLS进行数据加密;

       HTTP以及HTTPS可以穿越企业防火墙;

       客户端简单地通过浏览器访问版本库;

               1>创建版本库:

                    svnadmin  create   /var/svn/web_project3

          svn  import   /var/web_code3   file:///var/svn/web_project3   -m  "Term  3"  

              2>安装Apache及相关模块软件:

                    yum  -y  install httpd

                    yum  -y  install   mod_dav_svn

              3>修改Apache配置:

                          为了让Apache  Web  Server 可以读取SVN版本库中的数据,我们需要修改httpd针对SVN的配置文件subversion.conf,在该文件中至少确保                        mod_dav和mod_dav_svn两个模块会被加载,还要确保/etc/httpd/conf/httpd.conf文件中dav_module模块也会被加载;另外为了满足用户对数据安全的                 需求,我们还可以利用httpd的认证模块实现基于账户和密码的访问机制; 

                                    

 

                         chown   -R   apache.apache   /var/svn                           修改权限

          chown  -R   -t   httpd_sys_content_t         /var/svn          仅当SELinux开启时使用

          htpasswd  -c   /var/svn/.pass   jerry                                 创建账户文件,添加jerry用户

               service   httpd start

                         chkconfig    httpd  on

                  4>客户端访问

                                   我们可以使用任何一款浏览器通过URL访问版本库数据,通过地址加端口和版本库根目录访问;

7》常见问题:

             1>访问版本库路径错误:

                        如果通过svnserve命令启动服务时指定了发布的具体版本库,则客户端访问时就可以直接使用相对路径访问,如果服务器端使用svnserve  -d  -r                      /var/svn  启动服务后,客户端依然使用svn  co  svn://172.16.0.118/var/svn/web_project  /mine  ,系统将提示:svn:No  repository  found,说明没有                      找到该版本库,正确的写法是svn  co  svn://172.16.0.118/web_project  mine;

              2>每次想访问版本库时,进程就会挂起:

                         首先确保版本库没有被破坏,数据也没有丢失,当进程直接访问版本库时,进程将通过Berkeley DB来实现,Berkeley DB包含日志系统,也就是                   说,所有的操作在执行前都被记录在日志中;当进程崩溃时,遗留下文件锁,并记录了所有未完成操作的信息,从而导致所有试图访问数据库的进程                   将因为要访问文件锁而被挂起,若想解除文件锁,可以回滚到前一个正常状态;

              3>subversion提示工作副本已过时:

                             这可能是提交失败导致了你的工作副本被破坏,可以使用svn  revert回滚,svn  update更新来解决该问题;

               4>Windows  XP下,subversion服务器有时会发布一些错误数据:

                            如果你是在windows平台下搭建subversion服务器,可以尝试通过安装SPI补丁包解决该问题;

               5>Apache拒绝访问:

                            通过浏览器访问版本库时提示:You  don't  have  permission  to access  /svn  on this  server;出现这种提示说明没有权限读取相应的目录,如                       用户在这里输入