设为首页 收藏本站
查看: 459|回复: 0

[经验分享] 实用svn主干trunk自动merge到各个分支branch脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-9-9 10:55:05 | 显示全部楼层 |阅读模式
大多数使用svn的公司,当发现bug时或新功能时,会从主干trunk直接产生一个分支branch,如叫bug01。接着同事A修改里面的bug,如果测试通过,就提交分支,将分支bug01合并到主干,并解决冲突和主干保持一致。同事B也拉了个分支bug02,他也修改了,也测试通过,就提交分支,将分支bug02合并到主干,并解决冲突和主干保持一致。理论上没有任何问题。
问题出现
  但是有这样一个情况,同事A修改完就提交分支,合并到主干解决冲突,修改n次,同事B是修改完就提交,不合并到分支。修改了n次。突然有一天,同事想合并到主干时发现n多冲突,bug02和分支越走越远,不知道从哪下手解决。
解决思路
就是要让分支不要离主干太远,主干自动合到分支,没有发现冲突就合并,发现冲突,就revert还原分支,发冲突详情邮件,人工处理。做的定时,如果不处理,就一直发邮件。
有了脚本
脚本发邮件是用sendEmail,不是sendmail。是国外Brandon用perl写的,使用简单并且功能强大.这个被设计用在php、bash、perl和web站点使用。
官网:Http://caspian.dotconf.net/menu/Software/SendEmail/
不费话了,看脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#!/bin/bash
#write: lijing QQ 858080796
#date:  20160722 v1.0
#description:合并svn的主干到分支,无冲突,则merge,有冲突,就取消merge,并revert 和 发告警(邮件).

#定义变量
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 和 发告警(邮件)..........."

#主程序
#   清空日志
echo > $SMSLOG
#   将主项目trunk合到branch下分支,将管理台项目sys_admin合到admin_branch下给个分支。
NeedMerge="trunk sys_admin"
for NeedMerge in $NeedMerge ;do
    [ -n "$NeedMerge" ] && [ "$NeedMerge" = "sys_admin" ] && SRCDIR=sys_admin DSTDIR=admin_branch  ||  SRCDIR=trunk DSTDIR=branch
    echo -e " $NeedMerge \n"
    echo $SRCDIR
    echo $DSTDIR
    cd $SVN_WORK_ROOT/$DSTDIR && rm -rf $SVN_WORK_ROOT/$DSTDIR/*
    echo > $LOG
    echo -e  "\n $DATE $SRCDIR 合并到 $DSTDIR 各个分支详情如下: \n " >> $SMSLOG
    echo "更新本地已有副本 ..........."
    UPDATE_SVN  $SRCDIR $DSTDIR
    echo "下载新版本更新到本地 ............"
    CO_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效果图
QQ截图20160909105417.png

本文是 巧妙绝情 一个字一个图打出来,参考了好多资料,感谢他们的分享,基于open source分享精神,转载请注明出出。
支持我,请 用力 点击 巧妙绝情  谢谢
实用的svn主干trunk自动merge到各个branch分支shell脚本.rar (620 Bytes, 下载次数: 1)
参考资料:
http://caspian.dotconf.net/menu/Software/SendEmail/


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-269879-1-1.html 上篇帖子: linux开机启动流程 下篇帖子: 关于TCP的socket的bind函数的IP地址参数的详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表