柳暗花明笔记

    使用Subversion的svn协议访问

    所属分类:[ 杂七杂八 ] 猫哲学家 发表于:2013-03-13 19:15 浏览:427

    昨天讲解了Subversion的基本用法,其中把仓库创建在与客户端相同的机器上,使用file:///协议进行上传和修改的工作。实际上,更多时候,仓库应该放在另一台远端服务器上的,在这两端之间,是通过各种仓库存取层(Repository Access,简称RA)的多条通道进行访问的。这些通道中,可以通过不同的网络协议,例如HTTP、SSH等,或本地文件的方式来对仓库进行操作。

    Subversion一般使用两种后台服务模式:一种是其自己实现的 svnserve,可以通过svn协议访问,另一种是借助mod_dav_svn 模块,由Apache http 服务器来实现,然后通过HTTP或HTTPS协议来访问。我将要介绍就是第一种方式。

    一、svn协议

    客户端若要通过svn协议访问仓库,必须在存放仓库的机器上运行svnserve服务程序。启动该程序后,会监听在3690端口,以响应客户端的访问工作。
     
    # svnserve -d -r /var/svn/repos

    -d 表示以后台模式运行,-r 用于指定仓库的位置。其余参数,请用svnserve -h查看。

    二、自动运行svnserve服务

    按照上面的命令,每次运行svnserve都可以启动该监听服务,也可以放入/etc/rc.local中让其在机器启动后自动运行。

    但是,一般我是不使用rc.local来管理类似的服务程序的,所以,我编写了一个svnd脚本,将其放入/etc/rc.d/init.d目录中,通过service或chkconfig进行管理:
     
    # service svnd start
    # service svnd status
    # service svnd stop
    # chkconfig --level 35 svnd on

    下载地址:
    (源码见最后附录部分)

    如果需要改变脚本中仓库的默认路径,可以在/etc/sysconfig目录中,定义一个svnd的文件,例如:
     
    引用
    # cat /etc/sysconfig/svnd
    SVN_HOME=/opt/svn

    这样,在启动svnd服务时,会自动使用该目录作为-r参数的指定路径。

    ※ 对于其他的系统服务,我都是建议使用相同的管理方式,即系统服务放在/etc/rc.d/init.d中,额外的参数放在/etc/sysconfig目录下,这样对统一管理会带来很大的方便。

    三、使用svn协议访问仓库

    1、创建仓库

    正如访问本地仓库一样,开始必须先用svnadmin在存放仓库的目录中创建必须的文件,以形成仓库。

    在远端,存放仓库的机器行运行:
     
    # svnadmin create /var/svn/repos/

    创建的文件和目录有:
     
    引用
    # ll -a /var/svn/repos/

    总计 36

    drwxr-xr-x 7 root root 4096 07-01 15:21 .
    drwxr-xr-x 3 root root 4096 07-01 11:00 ..
    drwxr-xr-x 2 root root 4096 07-01 15:21 conf
    drwxr-xr-x 2 root root 4096 07-01 15:21 dav
    drwxr-sr-x 5 root root 4096 07-01 15:21 db
    -r--r--r-- 1 root root    2 07-01 15:21 format
    drwxr-xr-x 2 root root 4096 07-01 15:21 hooks
    drwxr-xr-x 2 root root 4096 07-01 15:21 locks
    -rw-r--r-- 1 root root  229 07-01 15:21 README.txt

    一般不要手动去更新、删除、添加上述这些目录或文件的内容,应通过svn客户端来进行管理的工作。

    2、设置授权

    若通过svn协议访问远端的仓库,必须建立授权关系。svnserve对于每个仓库,都有一个独立的配置文件和独立的用户、权限管理。该文件存放在:
     
    引用
    repository-path/conf/svnserve.conf

    也就是对应在每个仓库的目录下面。使用svnadmin create创建仓库后,就会在对应的位置创建一个示范文件。
    以下是一个简单的例子:
     
    引用
    # vi /var/svn/repos/conf/svnserve.conf
    [general]
    anon-access = read # 允许匿名用户只读访问,若设置为none表示不允许匿名访问
    auth-access = write # 通过验证的用户可以读和写
    password-db = passwd # 用户保存文件,也可以使用绝对路径来指定位置
    authz-db = authz # 权限管理文件
    realm = My First Repository # 仓库名称

    可通过man svnserve.conf 获取帮助信息。
    ※ 注意,配置项前面不能有前置空格,否则后续执行svn命令时,会报Option expected错误

    然后,在上面指定的用户、权限配置文件中加入相关信息:
     
    引用
    # vi /var/svn/repos/conf/passwd
    [users] # 这是固定格式
    linuxing = redflag # linuxing是用户名,redflag是明文表示的密码
    harry = harryssecret

    允许访问该仓库的用户都可以在这文件中定义,而对应用户的权限,则在权限配置文件中定义:
     
    引用
    # vi /var/svn/repos/conf/authz
    [groups] # 这也是固定格式
    users1 = linuxing,harry # 定义属于组的用户

    # 可定义仓库中的某个相对路径,如[/],或[/project1]
    # 若是多个仓库共享一个权限文件,可以用仓库名加“:”开头来定义,如:[project2:/]
    # 这个project2必须是已经由svnadmin create /path/project2 创建好的仓库
    [/] 
    linuxing = rw # 定义某个用户的权限,r是只读、w是可写、留空是不允许访问
    @users1 = rw # 定义某个组的权限
    * = r # 用“*”号表示其他用户

    用户和权限配置文件必须与svnserve.conf中设置的路径相同。若把这两个配置文件放在仓库外,例如:/etc/svn/目录,则允许多个仓库共享同样的配置文件。
    用户和权限配置文件保存后即可生效,不需重启svnserve服务。

    3、访问仓库

    在保证远端svnd服务已经启动的情况下:
     
    引用
    # service svnd start
    Starting svnd:                                             [确定]
    # service svnd status
    svnserve (pid 21869) 正在运行...
    # netstat -ln|grep 3690
    tcp        0      0 :::3690                     :::*                        LISTEN

    参考前一篇日志的内容,使用svn客户端即可进行访问:
     
    引用
    # svn import /root/perl svn://localhost/project1 -m 'initialization'
    “root”的密码:
    认证领域:<svn://192.168.228.135:3690> My First Repository
    用户登录名:linuxing
    “linuxing”的密码:
    新增           /root/perl/tcp_socket_cli.pl
    新增           /root/perl/connect.pl
    新增           /root/perl/tcp_socket_dt_srv.pl

    提交后的修订版为 1。
    # svn list svn://localhost/project1
    connect.pl
    tcp_socket_cli.pl
    tcp_socket_dt_srv.pl

    ※ 注意:Linux下,默认会先以当前用户去验证,若用户名不匹配,可在后续的提示中输入指定的用户名。输入一次用户名后,svn会把验证结果保留在本地的~/.subversion/auth/svn.simple目录中,下次使用svn时,就不需要再做验证工作了。(除非修改了远端的验证用户名和密码)

    Checkout到本地:
     
    引用
    # svn checkout svn://localhost/project1
    A    project1/tcp_socket_cli.pl
    A    project1/connect.pl
    A    project1/tcp_socket_dt_srv.pl
    取出修订版 1。
    # cd project1/
    # svn list
    connect.pl
    tcp_socket_cli.pl
    tcp_socket_dt_srv.pl
    四、svnd服务脚本

    源码:
     
    #!/bin/bash
    #
    # Init file for SVNserve server daemon
    #
    # chkconfig: 2345 55 25
    # description: SVNserve server daemon

    # source function library
    . /etc/rc.d/init.d/functions
    # pull in sysconfig settings
    [ -f /etc/sysconfig/svnd ] && . /etc/sysconfig/svnd

    [ -z "$SVN_HOME" ] && SVN_HOME="/var/svn/repos"
    SVNSERVE="/usr/bin/svnserve"
    prog="svnd"
    RETVAL=0
    if [ ! -f $SVNSERVE ]; then
      echo "svnserve didn't fount."
      exit
    fi
    if [ ! -e $SVN_HOME ] || [ ! -d $SVN_HOME ];then
      mkdir -p $SVN_HOME
      if [ $? -ne 0 ];then
        echo "Create $SVN_HOME directory failure."
        exit 1
      fi
    fi
    case "$1" in
      start)
        echo -n "Starting $prog:"
        $SVNSERVE -d -r $SVN_HOME && success || failure
        RETVAL=$?
        [ "$RETVAL" = "$?" ] && touch /var/lock/subsys/svn
        echo
        ;;
      stop)
        echo -n $"Stopping $prog:"
        if [ -n "`pidofproc $SVNSERVE`" ];then
          killproc $SVNSERVE
        else
          failure $"Stopping $prog"
        fi
        RETVAL=$?
        if [ "x$runlevel" = x0 -o "x$runlevel" = x6 ] ; then
          killall $prog 2>/dev/null
        fi
        [ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/svn
        echo
        ;;
      restart)
        $0 stop
        $0 start
        ;;
      status)
        status $SVNSERVE
        ;;
      *)
        echo "Usage: svn { start|stop|restart|status } "
        exit 1
    esac

    上一编文章 linux svn安装和配置,不结合apache 下一编文章 PHP创建和修改PDF文档,支持html,css相当好用
    最近文章
    发表评论