该脚本仅适用于Subversion代码仓库,主要功能是将分支代码合并至目标仓库中,合并时自动生成并导出diff文件,用户确认差异文件无误后方可继续。

|
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 # 最后更新:2025/06/27 # 脚本开发:刘智林 # 脚本功能:代码增量提交通用脚本(SVN) # 特殊说明:服务器必须安装lrzsz服务 # 需对齐代码完整路径和增量完整路径下的目录 # 参数说明: # -a 项目编号简称(留空则自动从仓库链接中获取) # -c 代码完整路径 http://10.10.100.100/10001/CODE # -v 增量完整路径 http://10.10.100.100/10001/INCREASE/10001_INC_20221124_01 # -e 部署环境信息 uat/pat/prd # -u SVN 用户名称 (留空为默认) # -p SVN 用户密码 (留空为默认) # ./mergeCodeSvn.sh -a ${prjName} -c ${codeUrl} -v ${versUrl} -u ${svnUser} -p ${svnPass} # 基本工作目录 baseDir="${PWD}" verBase="vers" dirList=("src" "db" "cfg" "sh" "tmp") diffDir="DIFFF" # 代码合并日志 workLog="${baseDir}/MERGE/mergeCodeSvn.log" while getopts 'a:c:v:e:u:p:' OPT do case ${OPT} in a) prjName="$OPTARG";; c) codeUrl="$OPTARG";; v) versUrl="$OPTARG";; e) envName="$OPTARG";; u) svnUser="$OPTARG";; p) svnPass="$OPTARG";; esac done flag=0 [ -z "${codeUrl}" ] && echo "缺少代码路径" && flag=1 [ -z "${versUrl}" ] && echo "缺少分支路径" && flag=1 [[ "${codeUrl}" =~ ^svn.* ]] || [[ "${codeUrl}" =~ ^http.* ]] || flag=1 [[ "${versUrl}" =~ ^svn.* ]] || [[ "${versUrl}" =~ ^http.* ]] || flag=1 [ -z "${prjName}" ] && prjName=`echo ${codeUrl} | awk -F/ '{print $4}' | grep '_'` && [ -z "${prjName}" ] && echo "缺少项目名称" && flag=1 [ -z "${svnUser}" ] && svnUser="svnadmin" [ -z "${svnPass}" ] && svnPass="svnadmin@123" getTime (){ nowTime=`date +'%Y%m%d%H%M%S'` } getResult (){ [ ${getStatus} -ne 0 ] && getTime && echo -e "${nowTime}\t上一条指令执行失败\n" >> ${workLog} && exit 1 } getTime echo ">>>>>>>>>>>>>>> ${prjName}-${nowTime:0:8} <<<<<<<<<<<<<<<" >> ${workLog} # 检查必要参数 [ ${flag} -eq 1 ] && echo -e "${nowTime}\t缺少必要参数或参数错误导致无法合并代码\n" >> ${workLog} && exit 1 # 检查工作空间 workDir="${baseDir}/MERGE/${prjName}" [ "${envName^^}" = "DZZ" ] && workDir="${workDir}/DZZ" [ ! -d "${workDir}" ] && mkdir -p ${workDir} && getTime && echo -e "${nowTime}\t已经创建本地代码工作空间" >> ${workLog} # 检出代码 cd ${workDir} getTime [ -d "${codeUrl##*/}" ] && verInfo=`svn info ${codeUrl##*/} | grep -Ew "Revision|版本" | awk '{print $2}'` || verInfo=0 [ -z "${verInfo}" ] && verInfo=0 if [ ${verInfo} -gt 1 ] then echo -e "${nowTime}\t更新代码${codeUrl}" >> ${workLog} svn update ${codeUrl##*/} --username ${svnUser} --password ${svnPass} else [ -d "${codeUrl##*/}" ] && rm -rf ${codeUrl##*/} echo -e "${nowTime}\t检出代码${codeUrl}" >> ${workLog} svn co ${codeUrl} --username ${svnUser} --password ${svnPass} fi getStatus=$? getResult sleep 1 # 检出增量 getTime echo -e "${nowTime}\t检出增量${versUrl}" >> ${workLog} [ -d "${verBase}/${versUrl##*/}" ] && rm -rf ${verBase}/${versUrl##*/} svn co ${versUrl} ${verBase}/${versUrl##*/} --username ${svnUser} --password ${svnPass} getStatus=$? getResult # 复制文件 getTime echo -e "${nowTime}\t复制分支代码至版本库" >> ${workLog} for dirName in ${dirList[@]} do [ -d ${verBase}/${versUrl##*/}/${dirName} ] && cp -rf ${verBase}/${versUrl##*/}/${dirName}/* ${codeUrl##*/}/${dirName}/ || continue getStatus=$? getResult sleep 1 done # 核对更新 [ -z "`svn st ${codeUrl##*/}`" ] && echo -e "${nowTime}\t没有需要提交的代码\n" >> ${workLog} && exit 0 if [ -n "`svn st ${codeUrl##*/} | awk '{if ( $1 == "?" ) {print $2}}'`" ] then getTime echo -e "${nowTime}\t向仓库中预添加新增的文件" >> ${workLog} svn st ${codeUrl##*/} | awk '{if ( $1 == "?" ) {print $2}}' | xargs svn add getStatus=$? getResult fi sleep 1 # 核对差异 getTime echo -e "${nowTime}\t生成当前版本diff文件" >> ${workLog} [ ! -d "${diffDir}" ] && mkdir -p ${diffDir} diffFile="${diffDir}/${prjName}-${versUrl##*/}-${nowTime}.diff" svn diff ${codeUrl##*/} > ${diffFile} getStatus=$? getResult getTime echo -e "${nowTime}\t差异文件位置${workDir}/${diffFile}" >> ${workLog} sz -r -y ${diffFile} sleep 1 while true do read -p "核对diff差异,确认无误输入'Y'继续,输入'E'退出..." toNEXT [ "${toNEXT^^}" = "Y" ] && break [ "${toNEXT^^}" = "E" ] && exit 9 done # 提交代码 getTime echo -e "${nowTime}\t提交新代码至${codeUrl}" >> ${workLog} svn commit -m "合并版本${versUrl##*/}" ${codeUrl##*/}/* --username ${svnUser} --password ${svnPass} --force-log getStatus=$? getResult sleep 3 getTime echo -e ">>>>>>>>>>>>>>> ${nowTime} <<<<<<<<<<<<<<<\n" >> ${workLog} |
原创文章禁止转载:技术学堂 » Subversion代码增量合并通用Shell脚本

技术学堂














