原文地址:http://tech.alltosun.com/home/space.php?uid=3&do=blog&id=3103
我们在开发的过程将代码提交到SVN后使用SVN的hook,通过post-commit脚本,在目标文件夹根下执行svn update操作,将更新内容同步到测试环境,这样开发调试非常方便。
现在SVN库的文件数量越来越多,svn 本地的目录已经3个多G了,几十万个文件,在目标文件夹下执行svn update进行更新速度也就越来越慢了,常常提交之后SVN客户端会等几分钟没有响应,在没有响应的时间内,无法再继续提交内容。如果使用zendstudio进行提交的话,所有保存的操作都要等这个SVN提交完成才能继续。
原post-commit内容:
--------------------------------------------
#!/bin/sh
REPOS="$1"
REV="$2"
WEB=/data/web
FRAMEWORK=/data/framework
export LC_ALL=zh_CN.UTF-8
a=`svn update $WEB $FRAMEWORK /data/conf /data/shell --username x*******i --password ******* | grep 'nginx\.conf'`
if [ -n "$a" ] then kill -HUP `cat /dev/shm/nginx.pid` fi
chown -R www.www $WEB &
-----------------------------------------------
我们主要做了以下几个工作:
1、SVN更新后,同步在/data/web、/data/framework、/data/conf、 /data/shell 4个文件夹在下执行svn update命令进行同步更新操作。
2、如果/data/conf/nginx.conf文件修改了,那么重启nginx。 3、将所有/data/web目录下的文件所有者和组都变成www。 原因在于: 1、提交的SVN的时候,4个文件在根下进行更新,文件数量巨大响应非常慢。
2、chown的操作也是比较浪费。
解决的想法:对有变化的文件进行 svn update 这样更有效率。 解决的思路: 1、得到本次提交更新的文件。
2、在目标目录中更新指定的文件。
3、同时将指定文件所有者和组变成www。
4、使用PHP程序当shell来完成这样的工作。 最后的成果是巨大的,现在svn提交已经是飞一样的快了,要知道svn 本地的目录已经3个多G了,几十万个文件。
实现步骤: 1、得到更新的文件。通过分析我们发现post-commit脚本有两个变量 # 库的路径 REPOS="$1" # 新提交的版本号 REV="$2" 通过这样的操作就可以得到本次更新的内容与文件。
changed=$(svnlook changed -r $REV $REPOS)
2、将得到的本次更新的内容提交给PHP脚本来处理,分析哪些文件发生变化。
/usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php "$changed" & 用PHP分析出哪些文件发生变化后,构造shell命令,由PHP调用shell命令进行更新。
3、相关脚本:最新的post-commit文件内容:
-------------------------------------
#!/bin/sh
# 库的路径 REPOS="$1"
# 新提交的版本号
REV="$2"
WEB=/data/web
FRAMEWORK=/data/framework
export LC_ALL=zh_CN.UTF-8
changed=$(svnlook changed -r $REV $REPOS)
log=$(svnlook log -r $REV $REPOS)
n=$'\n' /usr/local/php/bin/php-cgi -q /data/shell/svn_post_commit_resources.php "$changed" &
--------------------------------------
处理更新内容,执行更新命令的PHP脚本文件
svn_post_commit_resources.php 的内容:
-----------------------------------------
<?php $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; }
// SVN copy 对应的文件
$f_name = '/data/' . $f_tem;
$cmd = "svn update '$f_name' --username x****i --password K****$;
chown www.www '$f_name'"; exec($cmd);
if (strpos($f_tem, 'nginx.conf')) { exec("kill -HUP `cat /dev/shm/nginx.pid`"); } }
exit(); ?>
分享到:
相关推荐
(1)在网上看了很多方案,类似于 在 hooks文件的 post-commit 文件中增加 || exit1 exit0;这种方案试过之后并没有解决问题; (2)最终解决方案,找到post-commit 文件的第52行,并把相应内容注释掉,问题得到了...
用法:将本bat文件(不可改名)存在svn服务器端安装目录\仓库名\hooks下(该目录下有多个*.tmpl文件,包括pre-commit.tmpl即linux下的提交钩子,而pre-commit.bat为windows下的提交钩子),并修改文件中相应目录(共...
通过在pre-commit文件查看用户的动作来限制删除文件的动作,通过查看用户输入的log信息长度,限制用户提交log
里面包含了pre-commit.bat批处理和pre-commit.exe两种方式
NULL 博文链接:https://tianjun309.iteye.com/blog/854373
将根据自己实际环境修改后的post-commit.bat放于hooks目录; allrcps.lst中放缺省邮箱,也放于hooks目录; 在commit过程的log窗口中任一行顶头使用 mailto:all(使用缺省邮箱) 如果指定接收人: mailto:uesr1 user2 ...
maven-svn-revision-number-plugin-1.7.jar 资源共享,有需要其他jar包的可以在评论留言,看到后我会陆续上传。
1、cmd进入py文件目录下执行py文件加入--help查看帮助,命令C:\change-svn-wc-format>change-svn-wc-format.py --help 2、cmd执行下面命令,把项目对应SVN从1.5降为1..4 change-svn-wc-format.py d:\Mydropbox\...
mod_svn-1.7.10-ap24-x64.zip
Eclipse SVN插件(svn-site-1.6.17)
svn-python-1.6.6.win32-py2.5.exe
maven git commit id plugin git-commit-id-plugin is a plugin quite similar to ...I had to quickly develop an git version of such a plugin. For those who don't know the previous plugins, it basically ...
svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16svn-site-1.8.16
svn-eclipse-site-1.6.10.zip
svn-1.2.0-setup.exe svn subversion 版本
windows环境svn服务器,提交限制文件大小脚本,pre-commit.bat,限制大小为byte
SVN-EclipsePlug-1.2.2.rar,进入公司的大概都会用到,将eclipse和服务器关联起来.
maven-svn-revision-number-plugin-1.2.jar
svn-1.4.2-setup安装版…… 这个还是说过多的解释么,怎么还要凑足20字……
这个压缩包包含svn-site-1.6.17 所需的jar包----------