CentOS 7 | svn安装和使用总结

写在前边

最近一直在做毕业设计,基于 Nginx 的高可用大并发微信电子商城系统设计与实现,由于项目是在线上负载均衡,且开发是在本地 Windows 环境下,需要把项目分别上传到两个服务器。
ftp 的话,每次有点改动都要拉整个文件夹覆盖,太慢了。
git 的话,我的 github 只有公共空间,有了上次博客上传到 github 被黑的教训以后,我再也不敢把带有关键服务账户和密码的项目上传到 github 了
所以,综合比较还是 svn 比较合适。

我的服务器环境为 CentOS 7 1708 64 位

安装 subversion

SVN 全名 Subversion,即版本控制系统。SVN 与 CVS 一样,是一个跨平台的软件,支持大多数常见的操作系统。作为一个开源的版本控制系统,Subversion 管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository)中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本,或是浏览文件的变动历史。Subversion 是一个通用的系统,可用来管理任何类型的文件,其中包括了程序源码。

1
yum install -y subversion

** ps:** _这里特别说明一下,linux 下 svn 服务端和客户端都是这个 _

开启 svn 服务

创建仓库

我们这里在 /var/www/下建立一个名为 svn 的仓库(repository),以后所有代码都放在这个下面,创建成功后在svn下面多了几个文件夹。

1
2
3
4
5
$ mkdir /var/www/svn
$ cd /var/www/svn
$ svnadmin create /var/www/svn
$ ls
conf db format hooks locks README.txt

conf 文件夹存放配置文件的,我们来看一下

1
2
3
4
5
6
7
$ tree conf/
conf/
├── authz #权限控制文件
├── passwd #帐号密码文件
└── svnserve.conf #SVN服务配置文件

0 directories, 3 files

仓库创建完成
** 注意:**

  • 或许你需要先安装tree,输入命令yum install -y tree
  • 或者 ls conf/ 得到 authz passwd svnserve.conf

配置 svn 服务

配置 passwd
1
2
3
4
5
6
$ vim conf/passwd
[users]
# harry = harryssecret
# sally = sallyssecret
svn = svnpasswd
svnre = svnrepasswd

上面的例子中我们创建了 2 个用户,一个 svn,一个 svnre

配置 authz
1
2
3
4
5
$ vim conf/authz
[/] //仓库下所有文件
svn=rw //可读可写
svnre=r //只读
*= //其他用户无任何权限
配置 svnserve.conf

找到如下五项,取消前边的注释并设置

1
2
3
4
5
6
7
$ vim conf/svnserve.conf

anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = passwd #使用哪个文件作为账号文件
authz-db = authz #使用哪个文件作为权限文件
realm = /var/www/svn/ # 认证空间名,版本库所在目录

注意:

  • 如果你的目录和我的不一致,最后一行的 realm 要记得改成你的 svn 目录
  • 一定要记得取消注释,注释时切记前面不要留有空格

SVN 服务的启动和停止

1
2
3
$ svnserve -d -r /var/www/svn                       //-d 表示守护进程, -r 表示在后台执行,默认端口为3690
$ svnserve -d -r --listen-port 3691 /var/www/svn //指定3691端口启动该服务
$ killall svnserve //停止全部

如果你启动了多个 svnserve,想停止其中一个

1
2
3
4
5
6
$ ps -ef | grep svnserve
root 4148 1 0 Dec12 ? 00:00:00 svnserve -d -r /var/www/svn/a/
root 8995 1 0 Dec09 ? 00:00:00 svnserve -d -r /var/www/svn/b/ --listen-port 3691
root 14855 1 0 Dec19 ? 00:00:00 svnserve -d -r /var/www/svn/c/ --listen-port 3692
root 27538 27343 0 09:39 pts/0 00:00:00 grep --color=auto svnserve
$ kill 8995 //停止3692端口的svnserve

客户端连接

windows 中使用 TortoiseSVN 连接,输入地址 svn://你的 IP 即可,不出意外输入用户名和密码就能连接成功了。
默认端口 3690,如果你修改了端口,那么要记得加上端口号。
注意
如果无法连接,可能是你的防火墙没有开放端口,CentOS 7 默认使用 firewall 作为防火墙,Firewall 使用总结

1
2
3
4
$ firewall-cmd --zone=public --add-port=3690/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)
success
$ firewall-cmd --reload
success

如果是云服务器,请在防火墙开放端口后,进入控制台,在实例安全组中配置开放端口

腾讯云安全组产品使用文档

阿里云安全组产品使用文档

SVN 客户端命令使用

将文件 checkout 到本地目录

1
2
3
4
5
6
7
svn checkout svn_path local_path
//例如:
svn checkout svn://192.168.1.131/45dian/brand
//推荐添加本地目录:
svn checkout svn://192.168.1.131/45dian/brand ./brand/
//简写
svn co

往版本库添加新的文件

1
2
3
4
5
6
7
svn add file
//例如(添加test.php):
svn add test.php
//添加当前目录下所有的php文件
svn add *.php
//添加user目录(同时将目录下所有内容(递归)添加)
svn add user

添加完成以后需要提交到版本库。

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

1
2
3
4
5
6
svn commit -m '注释内容' [-N] [--no-unlock] PATH
//简写
svn ci
//提交文件夹及目录
svn ci -m '添加新文件' test.php
svn ci -m '添加新目录(递归)' user

加锁/解锁

1
2
3
4
5
svn lock -m '加锁注释内容' [--force] PATH
//例如:
svn lock -m "锁定文件" test.php
//解锁内容
svn unlock PATH

更新版本

在修改文件之前,一定要先更新版本库,再修改文件,然后提交。
如果提交的时候提示过期,是因为冲突,需要先 update,修改文件,然后清楚 svn resolved ,最后再提交 commit。

1
2
3
4
5
6
7
8
9
svn update -r m PATH
//更新到最新版本:
svn update
//将文件还原到历史版本200
svn -r 200 test.php
//把test.php 更新到最新版本
svn update test.php
//简写
svn up

查看文件或者目录状态

1
2
3
4
5
6
7
8
9
10
11
12
13
svn status PATH
//显示文件及子目录的状态,正常不显示
// ? 不在svn的控制中
// M 内容被修改
// C 发生冲突
// A 预订加入到版本库
// K 被锁定
svn status -v PATH
//例如:
svn status
svn status -v
//简写
svn st

删除文件

1
2
3
4
5
6
7
8
svn delete PATH -m '注释内容'
//例如:
svn delete svn://192.168.1.133/45dian/brand/test.php -m '删除svn中文件'
//或者(推荐使用)
svn delete test.php
svn ci -m '提交删除的文件'
//简写
svn (del,remove,rm)

查看日志

1
2
3
4
5
svn log PATH
//例如:
//显示这个文件的修改记录,及版本号的变化
svn log
svn log test.php

查看文件详细信息

1
2
3
4
5
6
svn info PATH
//例如:
//显示当前目录的信息
svn info
//显示test.php文件信息
svn info test.php

比较文件及目录差异

1
2
3
4
5
6
7
8
svn diff PATH
//将修改的文件与仓库中最新版本比较
svn diff test.php

//版本之间对比
svn diff -r m:n PATH
//版本m与版本n比较差异
svn diff -r 200:201 test.php

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

1
2
3
4
5
//将m版本和n版本合并到当前文件
svn merge -r m:n path
//例如
svn merge -r 200:201 test.php
//但是一般都会产生冲突,需要处理一下

SVN 帮助

1
2
svn help
svn help ci

在版本仓库中添加文件夹

1
2
3
4
5
//在svn版本仓库中添加文件夹
svn mkdir PATH
//等价于
mkdir work
svn add work -m '添加文件夹'

代码库 URL 变更

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

解决冲突

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

一点 tips

如果使用 svn 管理 web 项目,建议切换到 web 服务的用户去使用客户端命令
PHP 中大部分流行的框架在 Linux 都需要 web 服务用户对cache文件夹拥有权限。

查看 web 服务用户
  • apache 查看
1
2
3
4
5
$ ps -aux | grep httpd
www 1813 0.0 2.5 809032 26276 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1814 0.0 2.7 809076 28412 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1815 0.0 2.4 809032 24468 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND
www 1816 0.0 2.5 809040 26396 ? S Dec20 0:00 /usr/sbin/httpd -DFOREGROUND

那么apache服务的用户就是www
apache 配置文件中也可以看到

1
2
3
4
5
$ cat /etc/httpd/conf/httpd.conf
...
User www
Group www
...
  • nginx 查看
1
2
$ ps -aux | grep nginx
nginx 4400 0.0 0.1 47164 2516 ? S Dec12 0:02 nginx: worker process

那么nginx服务的用户就是nginx
nginx 配置文件中也可以看到

1
2
3
4
$ cat /etc/nginx/nginx.conf
...
user nginx
...
配置 web 用户

apache为例
先保证www可以使用su

1
2
3
4
5
$ vim /etc/passwd
找到
www:x:1000:1000::/home/www:/sbin/nologin
修改为
www:x:1000:1000::/home/www:/bin/bash

使www可以使用sudo

1
2
3
4
5
6
7
8
9
$ visudo
找到
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

在下面添加一行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
www ALL=(root) ALL

然后就可以使用sudo -u www svn up,输入 svn 帐号和密码就可以了

有错误参考

文章不错,你都不请我喝杯茶,就是说你呀!
0%
upyun