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到网站去覆盖原有文件(最好把原有文件备份一份)。