Posts Tagged ‘ cvs ’

代码是各自为政。cvs管理员又落到了我的身上。

可以在同一代cvs服务器上维护多个代码仓库吗?如何做呢?

下面我们就一步步来在同一台机器上搭建多个cvs仓库,以project0和project1为例,仓库分别位于/cvsroot/project0和/cvsroot/project1目录

  1. 安装cvs。
    在redhat的系统上,使用rpm -qa | grep cvs查看是否安装了cvs包,如果没有找光盘安装下,或到rpmfind网站上找。当然也可以使用源代码安装。
  2. 建立cvs专用的用户组和用户
    # groupadd cvs
    # useradd -g cvs -d /cvsroot cvs
  3. 设置xinet.d
    # vi /etc/xinetd.d/cvspserver
    把disable = YES改为disable = NO
    把server_args = 后台的参数改为-f –allow-root=/cvsroot/project0 –allow-root=/cvsroot/project1 pserver
    # chkconfig –level 345 xinetd on
    # service xinetd restart
  4. 建立并初始化仓库
    # mkdir -p /cvsroot/project0
    # mkdir /cvsroot/project1
    # chown -R cvs:cvs /cvsroot
    # chmod 770 -R /cvsroot
    # cvs -d /cvsroot/project0 init
    # cvs -d /cvsroot/project1 init
  5. 好了,现在netstat -nl,看是否在2401端口监听。如果有,一切ok,下面来管理帐号
  6. 关于帐号
    每个cvs项目下有个目录CVSROOT,是cvs用管管理项目的一些文件。里面的passwd是cvs的帐号密码文件(cvs可以使用自己的密码,也可以使用系统的密码,也可以两者一起用),如果没有这个文件直接添加。我们来编辑这个文件。在编辑这个文件之前,需要提一下这个密码, 他使用的标准的crypt()函数进行加密,与unix帐号一样。最简单的方法可以在linux上随便添加一个帐号,然后从密码文件中把加密的密码复制出来再加到cvs的passwd文件中,然后把系统帐号删除。当然我提供一个脚本来生成这个密码。
    密码文件分三列,第一个为使用cvs客户端登陆时使用的用户名,第二列为密码(可为空), 第三列为使用的系统帐号。(当然,每个项目创建单独的系统帐号来映射,会带来更好的效果)
    #vi /cvsroot/project0/CVSROOT/passwd
    添加如下内容:
    foo:di35EudwM2NdU:cvs
    ufo:adoifeojfoeajo9:cvs
    # vi /cvsroot/project1/CVSROOT/passwd bar:aasdfeawe334a:cvs
    ufo:sasdfaefaoeajo9:cvs bar:adoifeojfoeajo9:cvs
  7. 对于更深层的控制,可以使用CVSROOT/readers和CVSROOT/writers。这两个文件是简单以换行符分割的cvs用户名列表。如果在readers文件中列出,则此用户为只读;如果在writers文件中被列出,则此用户可写,否则为只读。如果某个用户在两个文件中都读,吼吼,冲突了吧?为了安全,这时候是只读权限。
  8. 这时候登陆看看,是否可以登陆?
    cvs -d :pserver:foo@cvs.host.com:/cvsroot/project1 login
  9. 附:生成密码的perl脚本:

    #!/usr/bin/perl -w
    #
    use strict;

    print "Enter content to crypt:";
    chomp(my $string = <STDIN>);

    print "\nEnter two random char as salt:";
    chomp(my $salt = <STDIN>);

    my $crypt = crypt($string, $salt);
    print "The crypt passwd is:\t$crypt;

  10. 参考文献:
    cvs使用手册