今天把测试服务器的svn代码仓库与测试环境中的代码库同步调试通了,具体实现步骤:
准备工作:
先创建一个svn仓库导入需要的代码库 svnadmin create test.bbs.fumu.com; cd test.bbs.com; svn import
然后在测试的nginx环境中checkout这个项目的代码
svn的配置其实很简单
在创建的代码仓库test.bbs.com中的hooks目录中有一些svn写好的钩子模板
进去后修改post_commit模板的名称,去掉后缀.tmpl。这样这个模板就已经能正常执行了,这里的意思是在客户端正常提交svn文件修改(svn co)后调用此钩子程序
post_commit里面基本都是shell脚本:
REPOS="$1" //定义提交文件名
REV="$2" //提交版本号
WEB=/home/wwwroot/bbs //定义项目目录
export LC_ALL=zh_CN.UTF-8 //指定输出编码为svn默认的utf8
changed=$(svnlook changed -r $REV $REPOS) //定义svnlook changed内容
log=$(svnlook log -r $REV $REPOS) //记录日志
n=$' \n'
/usr/local/php/bin/php-cgi -q /home/wwwroot/svndata/test.bbs.fumu.com/hooks/svn_post_commit_resources.php "$changed" & //执行php脚本

其流程是 : 定义两个变量 REPOS,REV 然后把 svnlook changed的内容传给svn_post_commit_resources脚本

svn_post_commit_resources 的具体内容使用$argv变量获取接收传递进来的参数,然后做循环exec执行命了
$files = explode("\n",$argv[1]);
if(!is_array($files)){
$files = (array)$files;
}
foreach($files as $v){
$f_tem = trim(substr($v,2)); //获取文件名
$d_tem = substr($f_tem,0,strpos($f_tem,'/')); //取最顶层目录

//if(!in_array($d_tem,array('web','framework','conf','shell'))){
// continue;
//}

$f_name = '/home/wwwroot/bbs/'.$f_tem; //svn copy对应文件
$cmd = "svn update '$f_name' --username liyi --password liyi --non-interactive --config-dir /tmp/.subversion;chown root root '$f_name'";
if(strpos($f_tem,'nginx.conf')){
exec("kill -HIP 'cat /dev/shm/nginx.pid'");
}
}
exit();


我在这里遇到一个问题,exec函数无法执行,后来做了好几个测试才发现exec还有其他一些命了出于安全考虑在php.ini中被定义为禁止执行函数,在php.ini中display_functions中去掉exec函数即可。

下面是列举一些svn常用的钩子定义:
提示
由于安全原因,Subversion版本库在一个空环境中执行钩子脚本—就是没有任何环境变量,甚至没有$PATH或%PATH%。由于这个原因,许多管 理员会感到很困惑,它们的钩子脚本手工运行时正常,可在Subversion中却不能运行。要注意,必须在你的钩子中设置好环境变量或为你的程序指定好绝 对路径。

目前Subversion有已实现了五种钩子:

start-commit.bat
它在提交事务产生前已运行,通常用来判定一个用户是否有权提交。版本库传给该程序两个参数:到版本库的路径,和要进行提交的用户名。如果程序返回一个非零值,会在事务产生前停止该提交操作。如果钩子程序要在stderr中写入数据,它将排队送至客户端。

pre-commit.bat
在事务完成提交之前运行,通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个bug追踪的ticket号,或者是 要求日志信息不为空)而不允许的提交。版本库传递两个参数到程序:版本库的路径和正在提交的事务名称,如果程序返回非零值,提交会失败,事务也会删除。如 果钩子程序在stderr中写入了数据,也会传递到客户端。

Subversion的分发版本包括了一些访问控制脚本(在Subversion源文件目录树的tools/hook-scripts目录),可以用来被 pre-commit调用来实现精密的写访问控制。另一个选择是使用Apache的httpd模块mod_authz_svn,可以对单个目录进行读写访 问控制(见“每目录访问控制”一节)。在未来的Subversion版本中,我们计划直接在文件系统中实现访问控制列表(ACL)。

post-commit.bat
它在事务完成后运行,创建一个新的修订版本。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者作为版本库的备份。版本库传给程序两个参数:到版本库的路径和被创建的新的修订版本号。退出程序会被忽略。

Subversion分发版本中包括mailer.py和commit-email.pl脚本(存于Subversion源代码树中的 tools/hook-scripts/目录中)可以用来发送描述给定提交的email(并且或只是追加到一个日志文件),这个mail包含变化的路径清 单,提交的日志信息、日期和作者以及修改文件的GNU区别样式输出。

Subversion提供的另一个有用的工具是hot-backup.py脚本(在Subversion源代码树中的tools/backup/目录 中)。这个脚本可以为Subversion版本库进行热备份(Berkeley DB数据库后端支持的一种特性),可以制作版本库每次提交的快照作为归档和紧急情况的备份。

pre-revprop-change.bat
因为Subversion的修订版本属性不是版本化的,对这类属性的修改(例如提交日志属性 svn:log)将会永久覆盖以前的属性值。因为数据在此可能丢失,所以Subversion提供了这种钩子(及与之对应的post-revprop- change),因此版本库管理员可用一些外部方法记录变化。作为对丢失未版本化属性数据的防范,Subversion客户端不能远程修改修订版本属性, 除非为你的版本库实现这个钩子。

这个钩子在对版本库进行这种修改时才会运行,版本库给钩子传递四个参数:到版本库的路径,要修改属性的修订版本,经过认证的用户名和属性自身的名字。

post-revprop-change.bat
我们在前面提到过,这个钩子与pre-revprop-change对应。事实上,因为多疑的原因,只有存在pre-revprop-change时这个 脚本才会执行。当这两个钩子都存在时,post-revprop-change在修订版本属性被改变之后运行,通常用来发送包含新属性的email。版本 库传递四个参数给该钩子:到版本库的路径,属性存在的修订版本,经过校验的产生变化的用户名,和属性自身的名字。

Subversion分发版本中包含propchange-email.pl脚本(在Subversion源代码树中的tools/hook- scripts/目录中),可以用来发送修订版本属性修改细节的email(并且或只是追加到一个日志文件)。这个email包含修订版本和发生变化的属 性名,作出修改的用户和新属性值。

警告

不要尝试用钩子脚本修改事务。一个常见的例子就是在提交时自动设置svn:eol-style或svn:mime-type这类属性。这看起来是个好主 意,但它会引起问题。主要的问题是客户并不知道由钩子脚本进行的修改,同时没有办法通告客户它的数据是过时的,这种矛盾会导致出人意料和不能预测的行为。