该脚本仅适用于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 |
#!/bin/bash # 代码合并通用脚本 (适合Subversion版本库) # 服务器必须安装lrzsz服务 # 脚本参数说明: # -a 项目名称(代码在当前服务器的存放目录) # -c 代码完整路径 # -v 分支完整路径(末端位置与代码路径匹配) # -u 仓库用户名称(留空为默认) # -p 仓库用户密码(留空为默认) # ./mergeCode.sh -a ${prjName} -c ${codeUrl} -v ${versUrl} -u ${svnUser} -p ${svnPass} # 分支代码存放目录 versDir="vers" # 差异文件存放目录 diffDir="diff" # 代码合并日志文件 workLog="${PWD}/mergeCode.log" while getopts 'a:c:v:u:p:' OPT do case ${OPT} in a) prjName="$OPTARG";; c) codeUrl="$OPTARG";; v) versUrl="$OPTARG";; u) svnUser="$OPTARG";; p) svnPass="$OPTARG";; esac done [ -z "${svnUser}" ] && svnUser="myUserame" [ -z "${svnPass}" ] && svnPass="myPassword" flag=0 [ -z "${prjName}" ] && echo "缺少项目名称" && flag=1 [ -z "${codeUrl}" ] && echo "缺少代码路径" && flag=1 [ -z "${versUrl}" ] && echo "缺少分支路径" && flag=1 [[ "${codeUrl}" =~ ^svn.* ]] || [[ "${codeUrl}" =~ ^http.* ]] || flag=1 [[ "${versUrl}" =~ ^svn.* ]] || [[ "${versUrl}" =~ ^http.* ]] || flag=1 getTime (){ nowTime=`date +'%Y%m%d%H%M%S'` } getResult (){ getTime [ ${getStatus} -ne 0 ] && echo -e "${nowTime}\t上一条指令执行失败\n" >> ${workLog} && exit 1 } getTime echo ">>>>>>>>>>>>>>> ${prjName}-${nowTime:0:8} <<<<<<<<<<<<<<<" >> ${workLog} # 检查必要参数 [ ${flag} -eq 1 ] && echo -e "${nowTime}\t缺少必要参数或者参数错误导致无法合并代码\n" >> ${workLog} # 检查工作空间 workDir="${PWD}/MERGE/${prjName}" [ ! -d "${workDir}" ] && mkdir -p ${workDir} && getTime && echo -e "${nowTime}\t成功创建本地工作空间" >> ${workLog} # 开始合并代码 cd ${workDir} getTime verInfo=`svn info ${codeUrl##*/} | grep -Ew "Revision|版本" | awk '{print $2}'` if [ ${verInfo} -gt 1 ] then echo -e "${nowTime}\t更新代码${codeUrl}" >> ${workLog} svn update ${codeUrl##*/} --username ${svnUser} --password ${svnPass} getStatus=$? else [ -d "${codeUrl##*/}" ] rm -rf ${codeUrl##*/} echo -e "${nowTime}\t检出代码${codeUrl}" >> ${workLog} svn co ${codeUrl} --username ${svnUser} --password ${svnPass} getStatus=$? fi getResult sleep 1 getTime echo -e "${nowTime}\t检出分支${versUrl}" >> ${workLog} [ -d "${versDir}/${versUrl##*/}" ] && rm -rf ${versDir}/${versUrl##*/} svn co ${versUrl} ${versDir}/${versUrl##*/} --username ${svnUser} --password ${svnPass} getStatus=$? getResult getTime if [ "${codeUrl##*/}" != "${versUrl##*/}" ] then echo -e "复制分支代码至版本库时发现末端目录不匹配\n返回仓库核对代码分支的末端目录是否正常" while true do read -p "确定复制代码输入'Y'继续,输入'E'退出 - " toNEXT [ "${toNEXT^^}" = "Y" ] && break [ "${toNEXT^^}" = "E" ] && exit 8 done fi echo -e "${nowTime}\t复制本地分支代码至本地版本库" >> ${workLog} cp -rf ${versDir}/${versUrl##*/}/* ${codeUrl##*/}/ getStatus=$? getResult sleep 1 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 if [ -n "`svn st ${codeUrl##*/}`" ] then echo -e "${nowTime}\t生成当前版本diff文件" >> ${workLog} [ ! -d "${diffDir}" ] && mkdir -p ${diffDir} diffFile="${versUrl##*/}-${nowTime}.diff" svn diff ${codeUrl##*/} > ${diffDir}/${diffFile} getStatus=$? getResult getTime echo -e "${nowTime}\t差异文件位置${workDir}/${diffDir}/${diffFile}" >> ${workLog} sz -r -y ${diffDir}/${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向仓库中提交代码" >> ${workLog} svn ci -m "合并代码${versUrl}" ${codeUrl##*/}/* --username ${svnUser} --password ${svnPass} getStatus=$? getResult else echo -e "${nowTime}\t没有需要提交的代码" >> ${workLog} fi echo -e ">>>>>>>>>>>>>>>>>>>> 完成代码合并 <<<<<<<<<<<<<<<<<<<<\n" >> ${workLog} |
原创文章禁止转载:技术学堂 » Subversion代码合并通用Shell脚本