腾讯云×svn搭建

腾讯云本身提供了svn搭建的完整实践教程,文本版在此。但是一路上依然踩了不少坑,花了一整天才弄好,在此记录一下。

搭建前的准备

服务器1枚(本次使用腾讯云服务器)。

搭建需要登陆console,获取和修改服务器中内容——console从腾讯云控制台登陆,服务器中文件我通过Filezilla拉取。

服务器开放svn相关端口

添加安全组如下,允许svn访问:

0.0.0.0/0 TCP:3690 允许 -

安装svn

首先在console中安装svn:

yum install -y subversion

创建版本库

创建项目版本库,也就是项目对应的svn相关信息的地方(不是项目本身)。

✳ 相关路径可以自定义,不过腾讯云的server建议集中放在data这个目录下,因为其他文件夹都存储有服务器相关文件,尽量互不干涉为好。

 mkdir -p /data/svn/myproject //创建版本库所在的文件夹,手动创建的话可以跳过这一步
 svnadmin create /data/svn/myproject //在上述目录下创建svn版本库

修改svn库配置文件

创建版本库后,会自动在版本库文件夹中创建一些文件夹和文件,其中conf中有三个文件,用来设定账号密码和权限信息。需要修改这3个文件中的内容。

authz //权限控制文件
passwd //帐号密码文件
svnserve.conf //SVN服务综合配置文件

authz:

[groups]            
#用户组
admin = admin,root,test  
#用户组所对应的用户
[/]                 
#库目录权限
@admin = rw         
#用户组权限
*=r               
#非用户组权限

passwd:

# 用户名 = 密码内容
admin = 123233
root = 233332
test = 333222

svnserve.conf:

# 匿名访问的权限 可以是read、write,none,默认为read
anon-access = none
#使授权用户有写权限
auth-access = write
#制定密码文件路径
password-db = passwd
#制定访问控制文件
authz-db = authz
#svn版本库文件路径
realm = /data/svn/mysite

启动svn

svnserve -d -r /data/svn # 最后的路径是svn版本库所在文件夹的上一层路径

如果输入启动svn指令无法成功启动,而是提示svnserve: E000098: Can't bind server socket: Address already in use,说明指定路径的svn库已启动。可以通过ps -ef | grep svnserve查看当前启动的svn占用的端口和对应路径,可以通过sudo kill 端口ID来杀死关闭对应svn并释放端口。

checkout svn项目

mkdir -p /data/workspace/myproject # 同样是创建路径的指令,可以是随意自定义路径,用于存放具体的项目文件(和前面版本库文件是两回事)
svn co svn://127.0.0.1/myproject /data/workspace/myproject  # 前面是指定给项目文件的服务器本地路径,后面是对应的服务器中绝对路径名

随后会询问用户名和密码,正确输入后即可成功checkout。

从console提交文件

可以用这个在console先测试一下能否成功commit:

cd /data/workspace/myproject # 进入刚才checkout的项目文件夹中
echo test >> test.txt # 创建一个测试文件
svn add test.txt # 添加测试文件到svn
svn commit test.txt -m 'test' # 提交测试文件到svn

拉取svn项目到本地

首先本地电脑安装svn。

在期望路径下创建一个空文件夹(注意必须是空的),右键checkout,路径填写格式如下:

# 把前面checkout时设置的svn://127.0.0.1/myproject路径中的ip换成你的服务器公网ip即可
svn://服务器公网ip/mysite

OK后就可以拉取svn项目到本地了。

更新最新版本到serve路径

本地commit后,发现提交内容并没有出现在服务器对应路径下。这是因为svn项目文件并没有更新,上传的内容只是存储在版本库中。需要执行svn updatesvn up更新后才会出现在服务器对应项目路径。

注意更新时记得先进入对应路径。

自动更新🥳

如上所述,本地commit后文件并不能真的直接更新到serve中对应路径中,因为当初从serve上checkout下来的那个路径本身也只是个checkout出来的版本。

好在svn提供了hook,可以设置在执行commit操作后,自动对指定路径svn update。具体修改如下:

在svn版本库中可以找到hooks文件夹,在创建库的时候就存在了,可以看到里面有很多.tmpl文件,如果里面啥也没有也可以自行创建一个名为post-commit文件——注意不要加后缀!不要有任何后缀!否则无法被svn识别!

post-commit文件中,写入更新svn项目文件路径的指令:

#!/bin/bash
# 注意首行↑这句注释必须写上!

# 指定编码方式
export LANG=en_US.UTF-8

# svn执行目录,一般就是这个,如果不是可以which svn 查看
SVN=/usr/bin/svn

# svn项目文件路径
WEB=/data/mysite

# --username后面是svn账号,--password后面是svn密码
$SVN update $WEB --username admin --password llapruas13

此外记得进入对应svn版本库的hooks目录,在控制台输入以下代码修改其中post-commit文件的权限:

chmod a+x post-commit

之后在任意地方发生commit操作,服务器上的项目文件路径都会自动同步到最新提交版本。

其他

svn常见操作和问题

find / -name 查找次:列举包含查找词的路径

ps. ss开全局代理,腾讯云国内console会即连即断,害我以为有啥问题= - =