这篇文章上次修改于 2862 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

注:原创,转载请注明来处

最近svn提交发现非常的缓慢,怀疑应该是使用了svn的钩子hooks,自动更新导致的。

参考文档:http://blog.csdn.net/DaErDuoTuTuZi/article/details/54946486

思路:每次提交时把需要修改的文件写入日志文件中,然后通过python读取日志文件 每次只用更新提交的文件,而不用更新整个项目

修改post-commit:

REPOS="$1"
REV="$2"
#export PYTHONPATH=/usr/bin/
#/data/mysvn/hooks/mailer.py commit "$REPOS" "$REV" /data/mysvn/hooks/mailer.conf
#!/bin/sh
export LANG=en_US.UTF-8
LOG_FILE=/tmp/svn.log
changed=$(svnlook changed -r $REV $REPOS) # 比较改变的文件
echo "$changed" >> $LOG_FILE
#添加请修改下面的python文件
python /data/mysvn/hooks/svn_post_commit.py

python代码:

#coding=utf-8
__author__ = 'yangzhiwu'
import os,logging,time
from logging.handlers import TimedRotatingFileHandler
log_file_handler = TimedRotatingFileHandler(filename="/data/python/svn_opt.log", when="D", interval=1, backupCount=10)
logging.basicConfig(level=logging.INFO)
log = logging.getLogger()
log.addHandler(log_file_handler)
#逐行读取日志文件进行操作
for line in open('/tmp/svn.log'):
    tmp=line.split(' ',1)
    #svn 操作类型 A=增加 D=删除 U=修改
    opt=tmp[0]
    #svn上的文件路径
    change_file=tmp[1].strip()
    #进程下面的操作得当项目里面的文件路径
    filearr=change_file.split('/')
    filepath=change_file.replace('web/'+filearr[1], '')
    if filearr[2] == 'v':
        filepath=filepath.replace('/v', '')
    #结束
    #根据不同项目,定义不同的根路径
    if filearr[1] == 'upload':
        ROOTDIR='/data/www/wwwroot/upload'
    elif filearr[1] == 'jkd9.0':
        ROOTDIR='/data/www/wwwroot/jkd9.0'
    elif filearr[1] == 'jkd6.0':
        ROOTDIR='/data/www/wwwroot/jkd6.0'
    elif filearr[1] == 'jkd3.0':
        ROOTDIR == '/data/www/wwwroot/jkd3.0'
    elif filearr[1] == 'jkd10.0':
        ROOTDIR='/data/www/wwwroot/jkd10.0/v'
    elif filearr[1] == 'wxhtml':
        ROOTDIR='/data/www/wwwroot/wxhtml/wxhtml'
    elif filearr[1] == 'jkd10.1':
        ROOTDIR='/data/www/wwwroot/jkd10.1'
    elif filearr[1] == 'jkd10.2':
        ROOTDIR = '/data/www/wwwroot/jkd10.2/jkd10.2'
    elif filearr[1] == 'wap':
        ROOTDIR='/data/www/wwwroot/wap'
    #得当最终的svn要更新的绝对路径
    target_file=ROOTDIR+filepath;
    # print opt+'|'+target_file
    #根据opt定义svn的命令
    if opt == 'D' or opt == 'DD':
        cmd='rm -rf '+target_file
    else:
        cmd='svn up '+target_file
    #记录日志并执行svn命令
    logging.info('Time : %s ' % time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) )
    logging.info('Run cmd :%s' % cmd )
    os.system(cmd)
#删除日志文件
os.system('rm -rf /tmp/svn.log')

 

 

修改结束后,svn提交果然变的比以前快了很多。