原文地址: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(); ?>
分享到:
相关推荐
在另一篇文章中,有SVN搭建以及提交代码自动更新到项目目录的解决方案,文章链接如下: https://blog.csdn.net/qq_32845825/article/details/97274962 问题: 在提交代码之后,代码有更新到项目目录中,但是svn提示...
`commit-email.pl` 是一个Perl脚本,通常作为SVN服务器的post-commit钩子,当用户提交代码到SVN仓库后,该脚本会被触发,然后自动发送一封包含提交详情的邮件给指定的收件人。这不仅提高了团队协作效率,也确保了...
通过以上步骤,我们可以构建一个完整的svn自动commit系统,实现代码的自动同步到云管理的仓库。这种自动化不仅提升了效率,还使得开发流程更加规范和可靠。当然,自动提交应当谨慎使用,避免未经审查的代码直接进入...
通常,hooks 脚本位于 SVN 仓库的 `hooks` 目录下,每种类型的 hook 都有一个对应的脚本文件,如 `pre-commit.sample`、`post-commit.sample` 等。你需要根据自己的需求修改这些样本脚本,然后去掉 `.sample` 扩展名...
将根据自己实际环境修改后的post-commit.bat放于hooks目录; allrcps.lst中放缺省邮箱,也放于hooks目录; 在commit过程的log窗口中任一行顶头使用 mailto:all(使用缺省邮箱) 如果指定接收人: mailto:uesr1 user2 ...
SVN提交时必须写说明,说明少于10个字符则提交失败 把改文件放在SVN的hooks目录下,并修改一些文件里的路径即可
这些操作称为 Hook SCRIPT,其中包括 pre-commit、post-commit、pre-update、post-update 等多种类型的 Hook,每种 Hook 都有其特定的用途和执行时机。 在 Subversion 中,pre-commit Hook 是在客户端提交事务之前...
### Linux环境下配置同步更新的SVN服务器 #### 一、概述 版本控制系统是软件开发过程中不可或缺的一部分,它帮助团队管理代码的变化历史,并提供了一个协作的平台。Subversion(SVN)作为一款开源的集中式版本控制...
- `commit-hooks`、`pre-commit`、`post-commit`:这些是钩子脚本的路径,用于在提交前后执行自定义操作。 - `interactive-auth-parameters`:定义交互式认证参数,如是否记住密码、认证方式等。 - `log-encoding`:...
本文将指导读者在 Linux 环境下安装 SVN(Subversion),并使用钩子脚本实现本地提交后自动同步代码文件到服务器的网站目录下。 安装 SVN 首先,使用 yum 命令安装 SVN: `yum install subversion` 安装完成后,...
Subversion支持两种类型的钩子:预钩子(pre-commit hooks)和后钩子(post-commit hooks)。预钩子在提交操作发生之前运行,可以用来验证提交是否符合设定的规则,如检查日志消息是否为空或是否达到最小长度。如果...
在SVN仓库的hooks目录下,创建一个名为`post-commit`的脚本,通常是bash脚本。这个脚本将在每次提交后执行。 3. **编写`post-commit`脚本** 脚本的主要任务是收集提交信息(如提交者、修订版本、提交消息等)并...
- 在SVN仓库所在的`hooks`目录下创建一个名为`post-commit.bat`的批处理文件,此文件用于执行自动更新逻辑。 - `post-commit.bat`文件的内容如下: ```batch @echo off SET REPOS=%1 SET REV=%2 SET DIR=%...
1. 创建post-commit.bat文件:在hooks目录下创建一个名为post-commit.bat的文件,用于触发每次提交代码后的同步操作。 2. 赋予Visual Server执行bat文件的权限:需要赋予Visual Server执行bat文件的权限,以便每次...
在描述中提到的"svn同步web文件"是指通过SVN的hook机制,实现在每次提交(commit)到SVN服务器后,自动将更新的数据发布到Web服务器上,简化项目开发和测试流程。 实现这一功能的关键在于使用SVN的hook脚本,特别是...
该脚本在每次执行 SVN 提交操作后,会触发一个后置脚本(post-commit),通过执行特定命令发送通知到叮叮工作群,告知团队成员某人何时提交了什么内容,从而提高团队协作效率。 1. **VisualSVN**:VisualSVN是基于...
在SVN环境中实现双机热备,主要是利用`svnsync`工具进行数据同步,保证两台服务器上的版本库保持一致。 #### 实现步骤 1. **创建目标目录** 首先在备用服务器上创建一个与主服务器版本库结构相同的目录,并初始...
说明: 服务器操作系统:CentOS 服务器IP:192.168.21.134 ...一、使用SVN中post-commit实现自动实时从svn中检出文件并同步到Web站点根目录 cd /home/svn/hooks vi post-commit #编辑,添加以下代码 #!/bin/sh REPOS=$
- 在主机A中的SVN1中,需要配置post-commit钩子文件,以便每次提交时能够自动同步到从库: ```bash #!/bin/bash /usr/bin/svnsync sync --non-interactive "http://从项目的访问路径" --username svn用户 --...