IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 77|回复: 0

实用svn主干trunk自动merge各个分支branch脚本

[复制链接]

2000

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2017-10-10 19:02:20 |显示全部楼层
实用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和主干越走越远,不知道从哪下手解决。

解决思路
就是要让分支不要离主干太远,主干自动合到分支,没有发现冲突就合并,发现冲突,就发冲突详情邮件,直到人工处理。做的定时,如果不处理,就一直发邮件。
有了脚本
脚本发邮件是用sendEmail,不是sendmail。是国外Brandon用perl写的,使用简单并且功能强大.这个被设计用在PHP、bash、perl和web站点使用。
官网:Http://caspian.dotconf.net/menu/Software/SendEmail/
不费话了,看脚本:
  1. #!/bin/bash
  2. #write: lijing QQ 858080796
  3. #date:  20160722-20170301 v2.0
  4. #description:合并svn的主干到分支,无冲突,则merge,有冲突,就取消merge,并发告警(邮件).

  5. #定义变量
  6. source /etc/profile
  7. DATE=$(date "+%F %H:%M")
  8. SENDEMAIL=/usr/src/sendEmail                    #       定义发邮件程序
  9. SVN_WORK_ROOT=/data/everyday_co_itnanbksvn          #       定义下载到本地的svn副本目录
  10. ERROR=""
  11. AUTH_UP="--username=lijing  --password=lijing"          #       定义认证账号
  12. SVN_URL="http://svn.itnanbk.com/tcw/code/PHP"           #   定义SVN地址
  13. LOG=/tmp/.merge.log                     #   定义有、无冲突日志
  14. SMSLOG=/tmp/.sms.log                        #   邮件信息
  15. MAILUSER="858080796@qq.com"

  16. #定义函数
  17. #   定义显示颜色
  18.     Green(){
  19.             echo -e "\033[01;32m `date`$1 \033[0m\n"
  20.             Retval="0"
  21.         }
  22.     Red(){
  23.             echo -e "\033[01;31m `date`$1 \033[0m\n"
  24.             Retval="1"
  25.     }

  26. #   从版本库检出(checkout)到本地工作副本
  27.     CO_SVN() {
  28.         SRCDIR=$1
  29.         DSTDIR=$2
  30.                 #下到本地2次
  31.         cd $SVN_WORK_ROOT/$SRCDIR && svn  co $AUTH_UP $SVN_URL/$SRCDIR  .                    && Green "checkout $SVN_URL/$SRCDIR success" || Red "checkout $SVN_URL/$SRCDIR failed "
  32.        cd $SVN_WORK_ROOT/$DSTDIR && svn  co $AUTH_UP $SVN_URL/$DSTDIR  .                  && Green "checkout $SVN_URL/$SRCDIR success" || Red "checkout $SVN_URL/$SRCDIR failed "
  33.     }

  34. #   列出(list)版本库中的目录内容
  35.     LIST_SVN() {
  36.         SRCDIR=$1
  37.         DSTDIR=$2
  38.                 #列出内容赋值给SVNLIST
  39.              SVNLIST=$(svn list $AUTH_UP $SVN_URL/$DSTDIR)                               && Green "list $SVNLIST success" || Red "list  $DSTDIR failed"
  40.     }

  41. #   将版本库的修改更新(update)到本地工作副本
  42.     UPDATE_SVN() {
  43.         SRCDIR=$1
  44.         DSTDIR=$2
  45.                 #更新2次
  46.         cd $SVN_WORK_ROOT/$SRCDIR &&  svn update --force $AUTH_UP                          && Green "update  $SVN_WORK_ROOT/$SRCDIR  success" || Red "update  $SVN_WORK_ROOT/$SRCDIR  failed"
  47.         cd $SVN_WORK_ROOT/$DSTDIR &&  svn update --force $AUTH_UP                          && Green "update  $SVN_WORK_ROOT/$SRCDIR  success" || Red "update  $SVN_WORK_ROOT/$SRCDIR  failed"
  48.     }

  49. #   合并(merge)修改变动到本地工作副本     
  50.     MERGE_SVN() {
  51.         SRCDIR=$1
  52.         DSTDIR=$2
  53.                 #执行合并
  54.         echo "svn merge $AUTH_UP --non-interactive $SVN_URL/$SRCDIR"
  55.         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"
  56.     }  

  57. #       把本地工作副本的修改提交(commit)到版本库     
  58.     CI_SVN() {
  59.         SRCDIR=$1
  60.         DSTDIR=$2
  61.                 #执行提交
  62.         echo "svn ci $AUTH_UP $SVN_URL/$SRCDIR"
  63.         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"
  64.     }

  65. #   将工作副本文件恢复(revert)到原始版本(恢复大部分的本地修改)。
  66.     REVERT_SVN() {
  67.         SRCDIR=$1
  68.         DSTDIR=$2
  69.                 #执行还原
  70.         cd $SVN_WORK_ROOT/$DSTDIR/$SL &&  svn revert -R ./*  $AUTH_UP                        && Green "revert  $DSTDIR success" || Red "revert  $DSTDIR failed"

  71.     }  

  72. #   如果有冲突,发邮件告警(sendmail)
  73.     SENDMAIL(){
  74.         SRCDIR=$1
  75.         DSTDIR=$2
  76.                 #替换$SMSLOG日志中的"已恢复"为"冲突详情","-" 为"XX"
  77.         sed -i 's/已恢复/冲突详情/g' $SMSLOG |sed  's/\-\-\-/XXX/g'|sed  's/\-\-/XX/g'
  78.                 #执行发邮件
  79.         sms=$(cat $SMSLOG)
  80.             [ -z "$sms" ] && exit
  81.         $SENDEMAIL -s smtp.itnanbk.com -f itnanbk@itnanbk.com  \
  82.                             -t  $MAILUSER \
  83.                             -xu itnanbk@itnanbk.com -xp 'itnanbk2015'          \
  84.                             -u "大X网SVN merge 有冲突"  \
  85.                             -o message-content-type=auto \
  86.                             -o message-charset=utf-8  \
  87.                             -m "$sms"
  88.     }



  89. Green ".............write: lijing QQ 858080796 ........"
  90. Green ".............正在启动合并svn的主干到分支,无冲突,则merge,有冲突,就取消merge,并revert 和 发告警(邮件)..........."

  91. #主程序
  92. #    将主项目一trunk合到branch目录下各个分支,将管理台项目二sys_admin合到admin_branch目录下给个分支。
  93. #    清空日志
  94. echo > $SMSLOG
  95. #    定义项目一主干目录trunk,和项目二主干目录sys_admin
  96. TRUNKDIR="trunk sys_admin"
  97. for TRUNKDIR in $SWITCH_TRUNKDIR ;do
  98.        [ "$SWITCH_TRUNKDIR" = "trunk" ] && SRCDIR=trunk DSTDIR=branch  ||  SRCDIR=sys_admin DSTDIR=admin_branch
  99.     echo -e " $SWITCH_TRUNKDIR \n"
  100.     echo $SRCDIR
  101.     echo $DSTDIR
  102.     cd $SVN_WORK_ROOT/$SRCDIR && rm -rf $SVN_WORK_ROOT/$SRCDIR/*
  103.     cd  $SVN_WORK_ROOT/$DSTDIR && rm -rf $SVN_WORK_ROOT/$DSTDIR/*
  104.     echo > $LOG
  105.     echo -e  "\n $DATE $SRCDIR 合并到 $DSTDIR 各个分支详情如下: \n " >> $SMSLOG
  106.     echo "下载新版本更新到本地 ............"
  107.     CO_SVN $SRCDIR $DSTDIR
  108.     echo "更新本地已有副本 ..........."
  109.     UPDATE_SVN  $SRCDIR $DSTDIR
  110.     echo "列出目录内内容 ............"
  111.     LIST_SVN  $SRCDIR $DSTDIR
  112.         

  113.     for SL in  $SVNLIST ;do
  114.          
  115.             echo ..................................
  116.             echo "准备合并到$DSTDIR/$SL"
  117.         MERGE_SVN $SRCDIR $DSTDIR

  118.         cat $LOG |grep -qE "冲突概要|Summary of conflicts"    && Green "合并有冲突,失败"  || Red "合并无冲突,成功"
  119.         cat $LOG |grep -qE "冲突概要|Summary of conflicts"     || echo -e "无冲突,提交合并到 SVN 服务器 \n"  && CI_SVN $SRCDIR $DSTDIR && Green "无冲突,提交合并$SRCDIR 到 $DSTDIR SVN服务器,成功"
  120.      
  121.         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
  122.         #cat $LOG |grep -qE "冲突概要|Summary of conflicts"    && echo "发现冲突,执行revet: \n" && REVERT_SVN $SRCDIR $DSTDIR
  123.     done

  124. done
  125.         grep -q "冲突"  $SMSLOG  && echo "执行发邮件: \n "  && SENDMAIL $SRCDIR $DSTDIR
复制代码
最后,附上一张Foxmail效果图
今天(20170301)看自己博客时发现,其实大家只要稍改下我脚本,
就可以变成 “svn各个branch里分支自动merge到主干trunk脚本” 脚本人一直在用效果杠杠的,

本文是 巧妙绝情 一个字一个图打出来,参考了好多资料,感谢他们的分享,基于open source分享精神,转载请注明出出。
支持我,请 用力 点击 巧妙绝情  谢谢
参考资料:

本文出自 “巧妙绝情 - 李靖” 博客,请务必保留此出处http://qiaomiao.blog.51cto.com/484197/1850829
实用svn主干trunk自动merge各个分支branch脚本
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部