大多数使用svn的公司,当发现bug时或新功能时,会从主干trunk直接产生一个分支branch,如叫bug01。接着同事A修改里面的bug,如果测试通过,就提交分支,将分支bug01合并到主干,并解决冲突和主干保持一致。同事B也拉了个分支bug02,他也修改了,也测试通过,就提交分支,将分支bug02合并到主干,并解决冲突和主干保持一致。理论上没有任何问题。 问题出现
但是有这样一个情况,同事A修改完就提交分支,合并到主干解决冲突,修改n次,同事B是修改完就提交,不合并到分支。修改了n次。突然有一天,同事想合并到主干时发现n多冲突,bug02和分支越走越远,不知道从哪下手解决。 解决思路
就是要让分支不要离主干太远,主干自动合到分支,没有发现冲突就合并,发现冲突,就revert还原分支,发冲突详情邮件,人工处理。做的定时,如果不处理,就一直发邮件。 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效果图
本文是 巧妙绝情 一个字一个图打出来,参考了好多资料,感谢他们的分享,基于open source分享精神,转载请注明出出。
支持我,请 用力 点击 巧妙绝情 谢谢
实用的svn主干trunk自动merge到各个branch分支shell脚本.rar
(620 Bytes, 下载次数: 1)
参考资料:
http://caspian.dotconf.net/menu/Software/SendEmail/
|