centos下直接用yum安装svn

yum install subversion

检查svn版本

svnserve --version

一、建立版本库

创建svn数据目录(subversion默认是把/var/svn作为数据根目录的,开机启动默认也是从这里)

mkdir -p /var/svn

创建版本库

svnadmin create /var/svn/test

如果删除版本库

rm -rf /var/svn/test


二、导入导出工程项目

当我们拿到程序给我们的代码之后,我们就需要在svn服务器上将工程导入仓库,假如我们的网站是放在/var/www/test目录下

svn import /var/www/test file:///var/svn/test -m "test"

-m后是我们取的工程名

我们需要从仓库导出一份代码,这样才能实现在svn服务器上修改代码,update到运行目录

svn checkout svn://localhost:3777/test /var/www/final

其中/var/www/final是我们最后部署上线的目录


三、配置svn配置文件

每个版本库创建之后都会生成svnserve.conf主要配置文件

vim /var/svn/test/conf/svnserve.conf
[general]
anon-access = none                    #控制非鉴权用户访问版本库的权限
auth-access = write                   #控制鉴权用户访问版本库的权限
password-db = passwd                  #指定用户名口令文件名
authz-db = authz                      #指定权限配置文件名
realm = test                          #指定版本库的认证域,即在登录时提示的认证域名称


四、编辑svn用户配置文件

vim /var/svn/test/conf/passwd
[users]
admin = admin                #用户,密码
fuhd = fuhd                #用户,密码
test = test                #用户,密码


五、编辑svn权限控制配置文件

vim /var/svn/test/conf/authz
[groups]
admin = admin         #admin为用户组,等号之后的admin为用户
test = fuhd,test

[test:/]                #表示根目录(/var/svn/test),test: 对应前面配置的realm = test
@admin = rw            #表示admin组对根目录有读写权限,r为读,w为写

[test:/test]         #表示test目录(/var/svn/test/test)
@test = rw                #表示test组对test目录有读写权限


六、利用钩子hooks自动更新提交代码到网站目录

需要编辑

vim /var/svn/test/hooks/post-commit
#!/bin/sh
REPOS="$1"
REV="$2"
export      

SVN_PATH=/usr/bin/svn
WEB_PATH=/data/www/final
SVN_USER=test                                
SVN_PW=test
LOG_PATH=/var/log/svn.log

echo `date "+%Y-%m-%d %H:%M:%S"` >>$LOG_PATH
echo `whoami`,$REPOS,$REV >>$LOG_PATH

$SVN_PATH update $WEB_PATH --username $SVN_USER --password $SVN_PW --no-auth-cache >>$LOG_PATH || exit 1

chown -R www:www $WEB_PATH

exit 0

保存退出后

chmod +x post-commit

这样每次提交后都会更新到我们的网站目录。

其他hooks的作用如下

post-commit

在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略。

post-lock

对文件进行加锁操作之后执行该脚本

post-revprop-change

在修改 revision 属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值被忽略(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)

post-unlock

对文件进行解锁操作之后执行该脚本

pre-commit

在 Subversion transaction 完毕之后,在提交之前,执行该脚本

pre-lock

对文件进行加锁操作之前执行该脚本

pre-revprop-change

在修改 revision 属性之前,执行该脚本

pre-unlock

对文件进行解锁操作之前执行该脚本

start-commit

在客户端还没有向服务器提交数据之前,即还没有建立 Subversion transaction(缩写为 txn) 之前,执行执行该脚本


七、启动,查看和停止SVN服务

启动SVN服务

# -d:守护进程  -r:svn数据根目录   --listen-port:监听端口
svnserve -dr /var/svn/test --listen-port 3690

查看SVN服务

ps aux|grep svnserve               #默认端口为:3690

注意打开防火墙和关闭selinux

vim /etc/sysconfig/selinux
SELINUX = disable               #值修改为disable


遇到的问题

import的时候提示错误

svn: E000022: Error converting entry in directory '/var/www/test/images' to UTF-8
svn: E000022: Can't convert string from native encoding to 'UTF-8':

问题就是环境变量的编码设置的不好,解决办法

vim ~/.bashrc

加上

export LC_ALL=en_US.UTF-8
export.UTF-8
export LANGUAGE=en_US.UTF-8
source ~/.bashrc


update的时候提示错误

post-commit hook failed (exit code 1) with output:
Conflict discovered in '/data/www/index.php',
Select: (p) postpone, (df) diff-ful, (e) edit.
     (mc) mine-conflict, (tc) theirs-conflict,
     (s) show all options: svn: E070014: Can't read stdin: End of file found

由于更新的问题,网站和svn里的文件不一致,从svn checkout一份文件覆盖到网站里面去

svn checkout --depth=empty file:///svn/www/ www
cd www
svn update index.php

其中,www为checkout后的文件夹名,自己可以随意指定,执行svn checkout命令后,会得到一个名为www的空目录,里面什么都没有,而实现这一效果的就是参数中指定的depth=empty。
下一步就是进入刚刚checkout下来的www目录,执行update操作,想取哪个文件就checkout哪个文件就好了。最后把不一致的文件copy到网站去覆盖原有文件(最好把原有文件备份一份)。