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

author author     2022-08-04     484

关键词:

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

 

大多数使用svn的公司,当发现bug时或新功能时,会从主干trunk直接产生一个分支branch,如叫bug01。接着同事A修改里面的bug,如果测试通过,就提交分支,将分支bug01合并到主干,并解决冲突和主干保持一致。同事B也拉了个分支bug02,他也修改了,也测试通过,就提交分支,将分支bug02合并到主干,并解决冲突和主干保持一致。理论上没有任何问题。

问题出现
  但是有这样一个情况,同事A修改完就提交分支,合并到主干解决冲突,修改n次,同事B是修改完就提交,不合并到分支。修改了n次。突然有一天,同事想合并到主干时发现n多冲突,bug02和分支越走越远,不知道从哪下手解决。

解决思路
就是要让分支不要离主干太远,主干自动合到分支,没有发现冲突就合并,发现冲突,就revert还原分支,发冲突详情邮件,人工处理。做的定时,如果不处理,就一直发邮件。

有了脚本
脚本发邮件是用sendEmail,不是sendmail。是国外Brandonperl写的,使用简单并且功能强大.这个被设计用在php、bash、perl和web站点使用。
官网:Http://caspian.dotconf.net/menu/Software/SendEmail/
不费话了,看脚本:

#!/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="[email protected]"

#定义函数
#	定义显示颜色
	Green(){
        	echo -e "33[01;32m `date`$1 33[0m
" 
        	Retval="0"
    	}
	Red(){
        	echo -e "33[01;31m `date`$1 33[0m
" 
        	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 [email protected]                              -t  $MAILUSER                             -xu [email protected] -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 
"
	echo $SRCDIR
	echo $DSTDIR
	cd $SVN_WORK_ROOT/$DSTDIR && rm -rf $SVN_WORK_ROOT/$DSTDIR/*
	echo > $LOG
	echo -e  "
 $DATE $SRCDIR 合并到 $DSTDIR 各个分支详情如下: 
 " >> $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 服务器 
"  && CI_SVN $SRCDIR $DSTDIR && Green "无冲突,提交合并$SRCDIR 到 $DSTDIR SVN服务器,成功"
	
		cat $LOG |grep -qE "冲突概要|Summary of conflicts"   	&& echo -e " 
  发现冲突:  大X网SVN $SRCDIR merge到 $DSTDIR/$SL 有冲突  
  " >> $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: 
" && REVERT_SVN $SRCDIR $DSTDIR 
	done

done
        grep -q "冲突"  $SMSLOG  && echo "执行发邮件: 
 "  && SENDMAIL $SRCDIR $DSTDIR



最后,附上一张Foxmail效果图
技术分享

 

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

 

参考资料:

 http://caspian.dotconf.net/menu/Software/SendEmail/


本文出自 “巧妙绝情-李靖” 博客,请务必保留此出处http://qiaomiao.blog.51cto.com/484197/1850829

合并各分支(branches)到主干(trunk)

参考技术A在主干的文件夹中,右击->TortoiseSVN->Merge弹出框点击Next选择合并的对象(URL地址),点击Next,可以尝试Merge(testMerge)点击Merge,合并完成 查看详情

主干发布和分支发布

一:主干发布先说主干发布模式:以SVN库为例,大致将库分为trunk,branch,tag三种,主线发布就是公司要发布某个产品的V1版本,之前大家都做会在SVN的trunk上做开发,等trunk稳定了.开出一个分支B1,在B1分支上做V1版本的其它功能添加,bug修改... 查看详情

svn合并分支到主干

分支库中单元测试通过的源代码要合并到主干,例如有一个开发中的代码branches->dev需要合并到主干trunk。步骤:第一个步骤:在本地副本上进行操作,选择主干上的源代码文件,右键选择tortoiseSVN菜单,... 查看详情

svn打分支和合并操作

...。两者区别:Mergearangofrevisions。:把分支中的修改合并到主干上来。有冲突会爆出了,可以修改。Mergetwodiffere 查看详情

[git]rebase和merge

...h_19910525/article/details/7554489 Git merge是用来合并两个分支的。gitmergeb    #将b分支合并到当前分支gitrebaseb    # 把b分支合并到当前分支这个和svn有点类似,svn将branch合并到trunk上,也是在trunk的workcopy上,选择要 查看详情

如果我想将分支合并到主干上,“svn merge --reintegrate”和 svn merge without reintegrate 有啥区别

】如果我想将分支合并到主干上,“svnmerge--reintegrate”和svnmergewithoutreintegrate有啥区别【英文标题】:What\'sthedifferencebetween"svnmerge--reintegrate"andsvnmergewithoutreintegrateifI\'dliketomergeabranchontothetrunk如果我想将分支合并到主干上... 查看详情

svn合并分支到主干

分支库中单元测试通过的源代码要合并到主干,例如有一个开发中的代码branches->dev需要合并到主干trunk。步骤:第一个步骤:在本地副本上进行操作,选择主干上的源代码文件,右键选择tortoiseSVN菜单,... 查看详情

svn中trunk和branches分别是什麽意思?

...trunk和branches分别是什麽意思?有什麽区别?参考技术Atrunk:主干,平时开发都在这个文件夹内进行。branches:分支,里面存放从主干拉出来的各个分支,比如当遇到一个牵涉面很广的重大BUG,就可以从主干上为这个BUG拉一个分支到b... 查看详情

svn 从主干切换到分支

】svn从主干切换到分支【英文标题】:Svnswitchfromtrunktobranch【发布时间】:2013-01-1708:51:36【问题描述】:我在SVN托管项目的trunk的根文件夹中,并且正在探索建立两个分支。一个分支将是当前(稳定)版本的项目的“快照”,第... 查看详情

svn主干发布与分支发布的区别

一:主干发布先说主干发布模式:以SVN库为例,大致将库分为trunk,branch,tag三种,主线发布就是公司要发布某个产品的V1版本,之前大家都做会在SVN的trunk上做开发,等trunk稳定了.开出一个分支B1,在B1分支上做V1版本的其它功能添加,bug... 查看详情

svn分支开发与主干合并(branch&merge)

下面我将stepbystep地演示如何一次完整的branching和merging,包括创建分支、分支开发、分支和主线同步,分支合并到主线的全过程,甚至包括如何在本地创建一个测试用的repository。首先需要安装TortoiseSVN,我安装的版本是:TortoiseSV... 查看详情

svn分支开发与主干合并(branch&merge)

 【本文来自青鸟天空的CSDN博客,地址请点击:https://blog.csdn.net/bbirdsky/article/details/24620155 ,原文地址不清楚】 下面我将stepbystep地演示如何一次完整的branching和merging,包括创建分支、分支开发、分支和主线同步,分... 查看详情

svn分支/主干merge操作小记

一、前言  说来惭愧,鄙人从事开发多年,使用svn已经好几个年头了,但是却仅限于update、commit、compare之类的操作,最近想到github上学习别人写的NIO源码,顺便去熟悉git的使用,但是一想到svn,我心里虚了:用了那么多年却... 查看详情

svn主干(trunk)分支(branch)标记(tag)

主干(trunk)、分支(branch)、标记(tag)在SVN中Branch/tag在一个功能选项中,在使用中也往往产生混淆。 在实现上,branch和tag,对于svn都是使用copy实现的,所以他们在默认的权限上和一般的目录没有区别。至于何时用tag,何时用branc... 查看详情

转:svn合并分支到trunk

http://sepcot.com/blog/2007/04/svn-merge-branch-trunk SVN:MergingaBranchintoTrunk Thisismoreformybenefitthananythingelse,butsomeonemightfindthisuseful.Recentlyatwork,Ihavetakenonmoreresponsi 查看详情

主干(trunk)分支(branch)标记(tag)

以svn为例,git的master相当于trunk,dev分支相当于branches-------------------------------------------------------------------------------------------------------------------------------------------- trunk:是用来做主方 查看详情

svn分支整个项目合并主干

  1.首先主干要更新最新版本。  2.找到主干(trunk)点击右键--合并--合并类型选择(合并一个版本范围)点击下一步--合并源选择整个分支项目--将要合并的修改版本范围(选择指定(a)范围)点击下一步--点击合并。 &... 查看详情

svn合并分支到主干

http://blog.csdn.net/bbirdsky/article/details/24620155http://www.cnblogs.com/wenlong/archive/2012/05/07/2586853.htmlhttp://www.cnblogs.com/wenlong/archive/2012/05/07/2586853.htmlhttp://blog.csdn.net/b 查看详情