• 版本控制-https svn服务器搭建和常用命令(centos 6.3)


      Svn是比较优秀的版本控制工具,虽然功能和性能上无法和Git媲美,但由于其容易搭建和使用的特性,所以在各个小公司还是很受欢迎的。使用Git可参考《版本控制-Git服务器搭建和常用命令使用》本文介绍svn服务器搭建和常用命令介绍。


    一、搭建 svn 服务器 


    [root@master data1]# cat /etc/issue CentOS release 6.3 (Final) Kernel on an m [root@master data1]# getconf LONG_BIT 64

    1、安装svn服务器

    [root@master data1]# yum install subversion -y

    如果需要更新 svn 版本可以使用 wandisco 的 yum 源

    rpm -qa | grep subversion    查找已安装版本
    yum remove subversion-1.6.11-15.el6_7.x86_64 -y  卸载安装的1.6版本
    vim  /etc/yum.repos.d/wandisco-svn.repo
    添加下面代码
    [WandiscoSVN] name
    =Wandisco SVN Repo baseurl=http://opensource.wandisco.com/centos/$releasever/svn-1.9/RPMS/$basearch/ enabled=1 gpgcheck=0
    yum clean all
    yum install subversion -y

    2、新建svn服务器目录并初始化第一个仓库project

    mkdir /data1/svn
    svnadmin create /data1/svn/project

    3、新建文件夹并导入服务器作为Svn仓库project的第一个文件夹

    cd /data1
    mkdir -p test/client test/server
    svn import test file:///data1/svn/project/ -m 'init svn project'
    rm -rf test

    这样就将test目录下的client和server文件夹导入到仓库project下,然后删掉test文件夹

    4、新增用户并设置密码

      修改文件 /data1/svn/project/conf/passwd 新增用户 lx、u1、u2、u3,对应的明文密码在 "=" 右边

    [users]
    # harry = harryssecret
    # sally = sallyssecret
    lx = lx_passwd
    u1 = u1_passwd
    u2 = u2_passwd
    u3 = u3_passwd

    5、添加群组并增加访问控制

      修改文件 /data1/svn/project/conf/authz,增加g_lx和g_user两个群组,并对project仓库设置访问控制权限,不同目录允许不同群组的不同操作

    [groups]
    g_lx = lx
    g_user = u1, u2, u3
    
    [project:/]
    @g_lx = rw
    * =
    
    [project:/server]
    @g_lx = rw
    @g_user = r
    * =
    
    [project:/client]
    @g_lx = rw
    @g_user = rw
    * =

    r 表示对该目录有读权限,w 表示对该目录有写权限,rw 表示对该目录有读写权限。最后一行的* =表示,除了上面设置了权限的用户组之外,其他任何人都被禁止访问本目录,这点比较重要。

    6、升级成http认证服务器

    升级http需要安装相关软件

    yum install httpd mod_dav_svn 

    http之支持加密的密码,所以需要将svn的明文密码转换

    touch webpasswd
    htpasswd -b webpasswd  lx lx_passwd

    一步一步转换或者在 /data1/svn/project/conf 目录下新建下面perl脚本 pd.pl

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    open (FILE, "passwd") or die ("Cannot open the passwd file!
    ");
    
    open (OUT_FILE, ">webpasswd") or die ("Cannot open the webpasswd file!
    ");
    close (OUT_FILE);
    
    foreach (<FILE>) {
        if($_ =~ m/^[^#].*=/) {
            $_ =~ s/=//;
            `htpasswd -b webpasswd $_`;
        }
    }
    运行 perl pd.pl
    
    输出:
    Adding password for user lx
    Adding password for user u1
    Adding password for user u2
    Adding password for user u3

    7、修改 httpd.conf 文件

     vim /etc/httpd/conf/httpd.conf 
    
    在文件最后添加
    
    <Location /project>
         DAV svn
        SVNPath /data1/svn/project/
        AuthType Basic
        AuthName "svn for project"
        AuthUserFile /data1/svn/project/conf/webpasswd
        AuthzSVNAccessFile /data1/svn/project/conf/authz
        Satisfy all
        Require valid-user
    </Location>

    8、修改文件夹属主为apache

    chown -R apache.apache /data1/svn/project/

    9、启动 httpd

    service httpd start 

    10、打开web页面 http://master/project/ 

    建议更换成ip地址。输入账户密码如下:

    11、如果出现 (13)Permission denied: Could not open password file: /data1/svn... 则是因为SELinux未关闭,授权是无效的,需要修改SVN目录的权限配置。运行下面的命令

    chcon -R -h -t httpd_sys_content_t /data1/svn/project

    成功运行后删掉 passwd 文件,这样密码就只有你知道了

    12、升级 https

    一般公司的Svn服务器会搭建成https认证的服务器,密码则是使用ldap认证,所以搭建起来比较麻烦,除了httpd之外还要open-ssl等插件支持,但足够安全和实用。

    yum install openssl mod_ssl -y
    cd /etc/httpd/conf
    openssl genrsa -des3 -out server.key 1024
    命令运行期间需要用户输入并确认自己的密码
    
    对凭证进行填写必要信息,需要填写国家(CN),邮箱,公司等等,按要求填写即可(后面好像不需要用到)
    openssl req -new -key server.key > server.csr
    
    生成证书
    openssl req -x509 -days 2048 -key server.key -in server.csr > server.crt

    修改配置文件 httpd.conf

    vim httpd.conf
    
    增加
    LoadModule ssl_module modules/mod_ssl.so
    
    在<Location /project>中的最后加上
    SSLRequireSSL
    
    在文件最后加上
    SSLMutex default
    SSLRandomSeed startup builtin
    SSLSessionCache none
    
    ErrorLog /var/log/httpd/SSL.log
    LogLevel info
    SSLEngine On
    SSLCertificateFile conf/server.crt
    SSLCertificateKeyFile conf/server.key   

    重启 httpd,输入密码即可

    页面上访问 https://master:443/project/

    13、commit 的时候提交备注

    在 hooks 目录下面增加 pre-commit 文件即可,文件内容可以参考 pre-commit.tmpl 需要注意的是如果是中文在windows下可能会显示不了

    #!/bin/sh
    REPOS="$1"
    TXN="$2"
    SVNLOOK=/usr/bin/svnlook
    LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c)
    if [ "$LOGMSG" -lt 10 ]; then
    echo -e "
     Please submit a comment greater than 10 characters."1>&2        
    exit 1
    fi

     14、密码使用mysql保存验证

    首先需要 按照 mod_auth_mysql

    yum install mod_auth_mysql -y

    配置可参考 http://modauthmysql.sourceforge.net/CONFIGURE

    修改 httpd.conf 添加

    LoadModule mysql_auth_module modules/mod_auth_mysql.so 

    在 <location /project> 中修改

    AuthMySQLEnable On
    AuthMySQLHost master
    AuthMySQLPort 3306
    AuthMySQLSocket /data1/mysql/3306/mysql.sock
    AuthMySQLUser svn
    AuthMySQLPassword xxxx
    AuthMySQLDB user
    AuthMySQLUserTable user_auth
    AuthMySQLNameField user_name
    AuthMySQLPasswordField passwd
    AuthMySQLNoPasswd Off
    AuthMySQLPwEncryption md5   # 密码加密 md5
    # AuthMySQLSaltField
    AuthMySQLCharacterSet utf8
    AuthMySQLAuthoritative On  # 只支持 mysql 验证 取消其他验证方式

    在数据库 user 中新建一个表如下

    mysql> show create table user_authG
    *************************** 1. row ***************************
           Table: user_auth
    Create Table: CREATE TABLE `user_auth` (
      `user_name` varchar(32) NOT NULL COMMENT '用户英文名',
      `passwd` varchar(256) NOT NULL COMMENT '用户密码',
      `last_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
      PRIMARY KEY (`user_name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户认证'
    1 row in set (0.00 sec)

    并新建用户

    grant all privileges on user.user_auth to 'svn'@'master' identified by 'xxxx';

    重启 httpd 即可。

    如果遇到

    MySQL ERROR: Can't connect to MySQL server on 'master' (13)

    解决方法

    1. 查看httpd_can_network_connect的值是否为off(例如:httpd_can_network_connect --> off)
    # getsebool -a | grep httpd
    
    2. 修改httpd_can_network_connect的值为on
    # setsebool httpd_can_network_connect 1
    
    3. 重新验证httpd_can_network_connect
    # getsebool -a | grep httpd
    
    4. 重启http
    # service httpd restart

    如果遇到 

    Permission denied: make_sock: could not bind to address [::]:80

    则使用

    semanage port -a -t http_port_t -p tcp 80 

    但由于我的 semanage 一直安装失败但要下载一大堆依赖包,太麻烦了,我就使用了下面的方法

    setenforce 0     # 宽松模式
    service httpd restart
    setenforce 1   # 强制模式

     shell 下求 MD5 值的方法

    echo -n '12345'|md5sum|cut -d ' ' -f1      
    827ccb0eea8a706c4c34a16891f84e7b

     15、如果配置办公网访问一般需要关闭 iptables 或者配置

    iptables -nvL --line-number    # 查看规则
    
     iptables -I INPUT 4 -i eth0 -p tcp -s 10.1.126.0/8 --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT   # 在第4行插入443端口输入规则
    
    iptables -I OUTPUT 1 -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT   # 第一行插入443端口输出规则

     二、svn常用命令

    1、checkout到本地目录

    svn -–username=*** --password=*** checkout path

    2、往版本库中添加新的文件

    svn add file

    3、将改动的文件提交到版本库

    svn commit -m "LogMessage" [-N] [--no-unlock] PATH  
    # 如果选择了保持锁,就使用–no-unlock开关 # -m 后面是提交的日志信息,一般情况是必填的。

    简写:svn ci

    4、加锁/解锁

    svn lock -m "LockMessage" [--force] PATH

    5、本地更新到某个版本

    svn update -r * path   # *为版本号
    svn update   # 整个文件夹
    svn update file   # 单独一个文件

    6、查看文件或者目录状态

    1)svn status path  #目录下的文件和子目录的状态,正常状态不显示
    
    【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
    
    2)svn status -v path  # 显示文件和子目录状态
    
    第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
    
    注:svn status、svn diff和svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
    
    简写:svn st

    7、删除文件

    svn delete path -m "delete test fle"
    
    例如:svn delete svn://master/project/test.php -m “delete test file”
    
    或者分步骤(推荐使用这种)
    svn delete test.php
    svn ci -m ‘delete test file‘
    
    简写:svn  [del, remove, rm]

    8、查看日志

    svn log file
    
    显示这个文件的所有修改记录,及其版本号的变化

    9、查看文件详细信息

    svn info file

    10、比较差异

    svn diff path  # 将修改的文件与基础版本比较
    例如:svn diff test.php
    
    svn diff -r m:n path  # 对版本m和版本n比较差异
    例如:svn diff -r 200:201 test.php
    
    简写:svn di

    11、将两个版本之间的差异合并到当前文件

    svn merge -r m:n path
    
    例如:svn merge -r 200:205 test.php   # 将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要手动修改文件

    12、Svn 帮助

    svn help
    
    svn help ci

    以上是常用命令,下面写几个不经常用的

    13、版本库下的文件和目录列表

    svn list path   # 显示path目录下的所有属于版本库的文件和目录
    
    简写:svn ls

    14、创建纳入版本控制下的新目录

    svn  mkdir *    #  创建纳入版本控制下的新目录。
    
    用法: (1)、mkdir PATH…
    (2)、mkdir URL…
    
    创建版本控制的目录。
    (
    1)、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。 (2)、每个以URL指定的目录,都会透过立即提交于仓库中创建.在这两个情况下,所有的中间目录都必须事先存在。

    15、恢复本地修改

    svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。
    
    用法: revert PATH…
    
    注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录

    16、代码库URL变更

    svn switch (sw):   更新工作副本至不同的URL。
    
    用法: (1)、switch URL [PATH]
    (2)、switch –relocate FROM TO [PATH...]
    
    (1)、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。
    
    (2)、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。

    17、解决冲突

    svn resolved:  移除工作副本的目录或文件的“冲突”状态。
    用法: resolved PATH…
    
    注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。

    18、输出指定文件或URL的内容

    svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
    svn cat -r PREV filename > filename    (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

    本文部分内容是参考网上资源,由博主@Lx整理。

    原创文章,转载请备注原文地址 http://www.cnblogs.com/lxmhhy/p/6044054.html

  • 相关阅读:
    Git 最全命令使用
    git 配置(实用)
    用Redis进行实时数据排名
    最长上升子序列
    KMP算法
    计算星期几【基姆拉尔森公式】
    集合划分(贝尔数)
    合数分解(质因数分解)
    乘法逆元
    扩展欧几里得算法
  • 原文地址:https://www.cnblogs.com/lxmhhy/p/6044054.html
Copyright © 2020-2023  润新知