Apache Subversion(简称SVN),是一个开放源代码的版本控制系统,它在云端(服务器端)建立一个仓库,可以很方便地实现数据上传及同步。博主主要用来在本地与服务端间实现文件互传及共享,一定程度上代替FTP的功能。

一、搭建流程:

安装SVN

#检查是否安装了低版本的SVN
[root@VM_90_86_centos ~] rpm -qa subversion
#卸载旧版本SVN
[root@VM_90_86_centos ~] yum remove subversion
#安装SVN
[root@VM_90_86_centos ~] yum install subversion
#安装SVN模块
[root@VM_90_86_centos ~] yum install mod_dav_svn //选做
#检查是否安装成功
[root@VM_90_86_centos ~] svnserve –version
#出现subversion相关版本信息即安装成功

创建SVN仓库

#建立test文件夹,用作仓库
[root@VM_90_86_centos ~] mkdir -p /svn/test
#以该文件夹创建仓库
[root@VM_90_86_centos ~] svnadmin create /svn/test
#如果创建成功,test文件夹下会出现README.txt conf等文件
#在conf文件夹里还有authz、passwd、svnserve.conf三个文件

修改配置文件

  1. 编辑账号密码文件,即passwd文件
#在[users]下添加用户名及密码
[users]
# harry = harryssecret
# sally = sallyssecret
dmc = 123456
  1. 编辑权限控制文件,即authz文件
#在文件最后添加用户权限
#设置[/]代表根目录下所有的资源
[/]
dmc = rw
  1. 编辑SVN服务配置文件,即svnserve.conf文件
#对以下项取消注释,语句必须顶格(左边不能留空格),否则会出错
[general]
### The anon-access and auth-access options control access to the
#…
### users have read and write access to the repository.
#匿名访问的权限,可以是read,write,none,默认为read
anon-access = read
#使授权用户有写权限
auth-access = write
### The password-db option controls the location of the password
#…
### Uncomment the line below to use the default password file.
#指向验证用户名密码的数据文件 passwd
password-db = passwd
### The authz-db option controls the location of the authorization
#…
### Uncomment the line below to use the default authorization file.
#指向验证用户的权限配置文件 authz
authz-db = authz
### This option specifies the authentication realm of the repository.
#…
### is repository’s uuid.
#认证命名空间,填你的仓库地址,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm = /svn/test

配置防火墙(Firewalld)
CentOS7的默认防火墙服务是Firewalld,而非iptables,若要改用iptables请查阅相关教程。

#SVN默认使用的是3690端口
#永久(重启有效)打开3690端口
[root@VM_90_86_centos ~] firewall-cmd –zone=public –add-port=3690/tcp –permanent
#重新加载防火墙,更新防火墙规则
[root@VM_90_86_centos ~] firewall-cmd –reload
#查询3690端口是否已经打开
[root@VM_90_86_centos ~] firewall-cmd –query-port=3690/tcp

启动SVN服务

[root@VM_90_86_centos ~] svnserve -d -r /svn/test
#/svn/test 是你的仓库路径

现在已经可以通过TortoiseSVN访问你的SVN仓库。
地址填 svn://ip/
验证信息填设置的用户名和密码

其他SVN相关命令

#查看SVN进程
[root@VM_90_86_centos ~] ps -ef|grep svn|grep -v grep
root 6825 1 0 Dec26 ? 00:00:00 svnserve -d -r /svn/test
#检测SVN 端口
[root@VM_90_86_centos ~] netstat -ln |grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN
#关闭svn
[root@VM_90_86_centos ~] killall svnserve

建立多个仓库:
有时候在一个仓库里放多个项目可能很乱,那怎么建立多个仓库呢?其实很简单。

把多个仓库放在同一个文件夹

#建立三个文件夹,放在同一个父文件夹下(删掉原有仓库,或置于该文件夹下)
mkdir -p /svn/test1
mkdir -p /svn/test2
mkdir -p /svn/test3
#分别建立三个仓库
svnadmin create /svn/test1
svnadmin create /svn/test2
svnadmin create /svn/test3
  1. 分别配置三个仓库,即分别修改conf下的authz、passwd、svnserve.conf,当然,你也可以先配置好一个,然后把conf文件夹分别复制到其他仓库

3.(先关掉再打开)重启SVN服务

#注意!启动的是所有仓库的父文件夹路径 /svn
svnserve -d -r /svn
  1. TortoiseSVN连接:
    连接时由于主机上有多个数据仓库,所以在地址后要加上仓库名
#具体到本例
#连接到test1仓库
svn://ip/test1 #不再是svn://ip/
#连接到test2仓库
svn://ip/test2

到这,就成功建立起多个仓库了!

本地SVN连接远程服务端失败

1、配置好云控制台的端口(阿里云、腾讯云等其他)
2、配置服务器端防火墙

情况1:查看防火墙状态时

service iptables status

解决方案:
1、首先停止防火墙

systemctl stop firewalld

systemctl mask firewalld

2、然后安装iptables-servece

yum install iptables-services

3、设置开机启动防火墙

systemctl enable iptables

此时iptables-services 安装完毕
运行以下命令查看状态

service iptables status

4、开放端口3690(SVN默认端口)

iptables -I INPUT -p tcp --dport 3690 -j ACCEPT

service iptables save

service iptables restart

二、钩子自动更新(搭建SVN并用钩子自动实现同步到Web目录 )*
实现SVN与WEB同步,可以CO一个出来,也可以直接用自动更新web目录的方法,我们要在svn版本库中配置钩子来实现,就是创建一个post-commit的配置文件,对其进行简单的配置,简简单单的四步就可以实现Linux下SVN自动更新web目录配置。

1、建立你的web程序目录

mkdir /var/www/html/test
#进入你建立的web程序目录(svn checkout可以简写为co)
svn checkout svn://localhost/svntest //不重命名文件夹,直接在当前目录下检出
svn checkout svn://localhost/svntest test //检出文件并且重命名文件夹

2、在项目库的 hooks/ 目录下新建 post-commit 文件 【钩子脚本】

添加脚本内容如下

export LANG=zh_CN.UTF-8
SVN=/usr/bin/svn            #这里配置的是svn安装bin目录下的svn文件
WEB=/var/www/html/test      #要更新的目录
$SVN update $WEB --username cqh --password 123456
chown -R www:www  $WEB
#其中SVN=右边改成 svn 命令位置 
#WEB=右边改成你实际的web目录

第三步:让post-commit有执行的权限

chmod a+x post-commit

第四步:这里就已经完成了,第四步就是测试了。

说明:
export LANG=en_US.UTF-8是为了解决svn post commit 中文乱码,设置本地化编码,因为我的系统为UTF8编码,其实SVN默认就是UTF-8编码,如果编码是GBK的话不设置将会出现错误,而执行不成功,错误标识为

svn: Can't convert string from native encoding to 'GBK'
/usr/bin/svn update --username cqh --password 123456 /var/www/html/test 执行更新操作 

如果提示:

post-commit hook failed (exit code 255) with no output

赋予post-commit文件可执行权限
如果您的默认编码就是UTF-8的,要上传中文文件,先将文件另存为UTF-8格式在提交