实用svn主干trunk自动merge各个分支branch脚本
实用svn主干trunk自动merge各个分支branch脚本 大多数使用svn的公司,当发现bug时或新功能时,会从主干trunk直接产生一个分支branch,如叫bug01。接着同事A修改里面的bug,如果测试通过,就提交分支,将分支bug01合并到主干,并解决冲突和主干保持一致。同事B也拉了个分支bug02,他也修改了,也测试通过,就提交分支,将分支bug02合并到主干,并解决冲突和主干保持一致。理论上没有任何问题。 问题出现
但是有这样一个情况,同事A修改n次,每次修改完就提交到分支,合并到主干解决冲突。而同事B是修改完就提交到分支,不合并到主干。也修改了n次。突然有一天,同事B想合并到主干时发现n多冲突,bug02和主干越走越远,不知道从哪下手解决。
解决思路
就是要让分支不要离主干太远,主干自动合到分支,没有发现冲突就合并,发现冲突,就发冲突详情邮件,直到人工处理。做的定时,如果不处理,就一直发邮件。 - #!/bin/bash
- #write: lijing QQ 858080796
- #date: 20160722-20170301 v2.0
- #description:合并svn的主干到分支,无冲突,则merge,有冲突,就取消merge,并发告警(邮件).
-
- #定义变量
- source /etc/profile
- DATE=$(date "+%F %H:%M")
- SENDEMAIL=/usr/src/sendEmail # 定义发邮件程序
- SVN_WORK_ROOT=/data/everyday_co_itnanbksvn # 定义下载到本地的svn副本目录
- ERROR=""
- AUTH_UP="--username=lijing --password=lijing" # 定义认证账号
- SVN_URL="http://svn.itnanbk.com/tcw/code/PHP" # 定义SVN地址
- LOG=/tmp/.merge.log # 定义有、无冲突日志
- SMSLOG=/tmp/.sms.log # 邮件信息
- MAILUSER="858080796@qq.com"
-
- #定义函数
- # 定义显示颜色
- Green(){
- echo -e "\033[01;32m `date`$1 \033[0m\n"
- Retval="0"
- }
- Red(){
- echo -e "\033[01;31m `date`$1 \033[0m\n"
- Retval="1"
- }
-
- # 从版本库检出(checkout)到本地工作副本
- CO_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #下到本地2次
- cd $SVN_WORK_ROOT/$SRCDIR && svn co $AUTH_UP $SVN_URL/$SRCDIR . && Green "checkout $SVN_URL/$SRCDIR success" || Red "checkout $SVN_URL/$SRCDIR failed "
- cd $SVN_WORK_ROOT/$DSTDIR && svn co $AUTH_UP $SVN_URL/$DSTDIR . && Green "checkout $SVN_URL/$SRCDIR success" || Red "checkout $SVN_URL/$SRCDIR failed "
- }
-
- # 列出(list)版本库中的目录内容
- LIST_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #列出内容赋值给SVNLIST
- SVNLIST=$(svn list $AUTH_UP $SVN_URL/$DSTDIR) && Green "list $SVNLIST success" || Red "list $DSTDIR failed"
- }
-
- # 将版本库的修改更新(update)到本地工作副本
- UPDATE_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #更新2次
- cd $SVN_WORK_ROOT/$SRCDIR && svn update --force $AUTH_UP && Green "update $SVN_WORK_ROOT/$SRCDIR success" || Red "update $SVN_WORK_ROOT/$SRCDIR failed"
- cd $SVN_WORK_ROOT/$DSTDIR && svn update --force $AUTH_UP && Green "update $SVN_WORK_ROOT/$SRCDIR success" || Red "update $SVN_WORK_ROOT/$SRCDIR failed"
- }
-
- # 合并(merge)修改变动到本地工作副本
- MERGE_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #执行合并
- echo "svn merge $AUTH_UP --non-interactive $SVN_URL/$SRCDIR"
- cd $SVN_WORK_ROOT/$DSTDIR/$SL && svn merge $AUTH_UP --non-interactive $SVN_URL/$SRCDIR |tee $LOG && Green "merge $DSTDIR/$SL success"|| Red "merge $DSTDIR/$SL failed"
- }
-
- # 把本地工作副本的修改提交(commit)到版本库
- CI_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #执行提交
- echo "svn ci $AUTH_UP $SVN_URL/$SRCDIR"
- cd $SVN_WORK_ROOT/$DSTDIR/$SL && svn ci $AUTH_UP -m "$DATE 自动合并 $SRCDIR 到分支 /$DSTDIR/$SL" && Green "commit $DSTDIR/$SL success" || Red "commit $DSTDIR/$SL failed"
- }
-
- # 将工作副本文件恢复(revert)到原始版本(恢复大部分的本地修改)。
- REVERT_SVN() {
- SRCDIR=$1
- DSTDIR=$2
- #执行还原
- cd $SVN_WORK_ROOT/$DSTDIR/$SL && svn revert -R ./* $AUTH_UP && Green "revert $DSTDIR success" || Red "revert $DSTDIR failed"
-
- }
-
- # 如果有冲突,发邮件告警(sendmail)
- SENDMAIL(){
- SRCDIR=$1
- DSTDIR=$2
- #替换$SMSLOG日志中的"已恢复"为"冲突详情","-" 为"XX"
- sed -i 's/已恢复/冲突详情/g' $SMSLOG |sed 's/\-\-\-/XXX/g'|sed 's/\-\-/XX/g'
- #执行发邮件
- sms=$(cat $SMSLOG)
- [ -z "$sms" ] && exit
- $SENDEMAIL -s smtp.itnanbk.com -f itnanbk@itnanbk.com \
- -t $MAILUSER \
- -xu itnanbk@itnanbk.com -xp 'itnanbk2015' \
- -u "大X网SVN merge 有冲突" \
- -o message-content-type=auto \
- -o message-charset=utf-8 \
- -m "$sms"
- }
-
-
-
- Green ".............write: lijing QQ 858080796 ........"
- Green ".............正在启动合并svn的主干到分支,无冲突,则merge,有冲突,就取消merge,并revert 和 发告警(邮件)..........."
-
- #主程序
- # 将主项目一trunk合到branch目录下各个分支,将管理台项目二sys_admin合到admin_branch目录下给个分支。
- # 清空日志
- echo > $SMSLOG
- # 定义项目一主干目录trunk,和项目二主干目录sys_admin
- TRUNKDIR="trunk sys_admin"
- for TRUNKDIR in $SWITCH_TRUNKDIR ;do
- [ "$SWITCH_TRUNKDIR" = "trunk" ] && SRCDIR=trunk DSTDIR=branch || SRCDIR=sys_admin DSTDIR=admin_branch
- echo -e " $SWITCH_TRUNKDIR \n"
- echo $SRCDIR
- echo $DSTDIR
- cd $SVN_WORK_ROOT/$SRCDIR && rm -rf $SVN_WORK_ROOT/$SRCDIR/*
- cd $SVN_WORK_ROOT/$DSTDIR && rm -rf $SVN_WORK_ROOT/$DSTDIR/*
- echo > $LOG
- echo -e "\n $DATE $SRCDIR 合并到 $DSTDIR 各个分支详情如下: \n " >> $SMSLOG
- echo "下载新版本更新到本地 ............"
- CO_SVN $SRCDIR $DSTDIR
- echo "更新本地已有副本 ..........."
- UPDATE_SVN $SRCDIR $DSTDIR
- echo "列出目录内内容 ............"
- LIST_SVN $SRCDIR $DSTDIR
-
-
- for SL in $SVNLIST ;do
-
- echo ..................................
- echo "准备合并到$DSTDIR/$SL"
- MERGE_SVN $SRCDIR $DSTDIR
-
- cat $LOG |grep -qE "冲突概要|Summary of conflicts" && Green "合并有冲突,失败" || Red "合并无冲突,成功"
- cat $LOG |grep -qE "冲突概要|Summary of conflicts" || echo -e "无冲突,提交合并到 SVN 服务器 \n" && CI_SVN $SRCDIR $DSTDIR && Green "无冲突,提交合并$SRCDIR 到 $DSTDIR SVN服务器,成功"
-
- cat $LOG |grep -qE "冲突概要|Summary of conflicts" && echo -e " \n 发现冲突: 大X网SVN $SRCDIR merge到 $DSTDIR/$SL 有冲突 \n " >> $SMSLOG && cat $LOG|grep -E -v "^A|^D|^M|^G|^U|^R|^I|^\ G|^ U|^--" >> $SMSLOG
- #cat $LOG |grep -qE "冲突概要|Summary of conflicts" && echo "发现冲突,执行revet: \n" && REVERT_SVN $SRCDIR $DSTDIR
- done
-
- done
- grep -q "冲突" $SMSLOG && echo "执行发邮件: \n " && SENDMAIL $SRCDIR $DSTDIR
复制代码最后,附上一张Foxmail效果图
 今天(20170301)看自己博客时发现,其实大家只要稍改下我脚本, 就可以变成 “svn各个branch里分支自动merge到主干trunk脚本” 脚本人一直在用效果杠杠的,
本文是 巧妙绝情 一个字一个图打出来,参考了好多资料,感谢他们的分享,基于open source分享精神,转载请注明出出。
支持我,请 用力 点击 巧妙绝情 谢谢 参考资料:
实用svn主干trunk自动merge各个分支branch脚本
|