脚本实现将Subversion(SVN)仓库中指定的项目自动迁移至另一个仓库,同时以此为基线创建新分支,具备完善的判断机制和日志记录功能,可放心使用。

|
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 |
#!/bin/bash # 最后更新:2025/07/09 # 脚本开发:刘智林 # 脚本功能:迁移代码库自动化脚本 # 特殊说明:在脚本同级目录中的copyReposList.txt中添加待同步的仓库明细 # srcRepoBra(源始) desRepoBra(目标) # 源库名/code/uat/源码 目标库名/CODE/DEV/code # 工作目录 mainOpsDir="${PWD}/CPREPO" srcRepoDir="${mainOpsDir}/srcRepo" desRepoDir="${mainOpsDir}/desRepo" # 源始仓库 srcRepoURL="http://10.10.100.100/svn/" srcRepoUsr="svnadmin" srcRepoPwd="svnadmin@123" # 目标仓库 desRepoURL="http://10.10.100.101/" desRepoUsr="svnadmin" desRepoPwd="svnadmin@456" # 迁移列表 commitList="${PWD}/copyReposList.txt" # 迁移日志 commitLogs="${mainOpsDir}/copyReposLogs.log" # 日志等级 commitLogM=("【信息】" "【警告】" "【失败】" "【成功】" "配置管理员同步仓库代码") # 获取时间函数 getTime () { nowTime=`date +"%Y%m%d%H%M%S"` } # 获取上一次命令执行结果函数(仅在循环中使用) getResult () { [ $? -ne 0 ] && getTime && echo -e "${nowTime}${commitLogM[2]}上一次命令执行失败\n" >> ${commitLogs} && continue } # 检查是否安装软件 [ -z "`svn --version | grep -E "version|版本"`" ] && echo "${commitLogM[2]}本机没有安装subversion,终止代码迁移" && exit 1 # 检查迁移列表文件 [ ! -e "${commitList}" ] && echo "${commitLogM[2]}没有找到迁移列表文件,终止代码迁移" && exit 1 # 检查源始仓库工作目录 [ ! -d "${srcRepoDir}" ] && mkdir -p ${srcRepoDir} && echo "${commitLogM[0]}已创建源始工作目录" # 检查目标仓库工作目录 [ ! -d "${desRepoDir}" ] && mkdir -p ${desRepoDir} && echo "${commitLogM[0]}已创建目标工作目录" # 开始迁移仓库 cat ${commitList} | grep -v "^#" | while read srcRepoBra desRepoBra do [ -z "${srcRepoBra}" ] && continue getTime echo -e "----- ${srcRepoBra} -> ${desRepoBra} : ${nowTime}-----" >> ${commitLogs} # 记录当前行号 lineNumber=`grep -n "${srcRepoBra}" ${commitList} | grep -v "^#" | head -n 1 | awk -F: '{print $1}'` sleep 1 getTime # 检查仓库信息 [ -z "${desRepoBra}" ] && echo -e "${nowTime}${commitLogM[2]}迁移信息表第${lineNumber}行项目信息不全\n" >> ${commitLogs} && continue # 检查历史记录 commitHistory=`grep "^#" ${commitList} | grep -Ew "${srcRepoBra}" | grep -Ew "${desRepoBra}"` [ -n "${commitHistory}" ] && echo -e "${nowTime}${commitLogM[1]}该项目之前已成功迁移代码\n" >> ${commitLogs} && continue # 删除本地仓库目录(源始) cd ${srcRepoDir} [ -d "${srcRepoBra}" ] && rm -rf ${srcRepoBra} && echo -e "${nowTime}${commitLogM[0]}已经删除之前下载的代码" >> ${commitLogs} getTime # 导出源始仓库代码 echo -e "${nowTime}${commitLogM[0]}开始导出代码${srcRepoURL}${srcRepoBra}" >> ${commitLogs} svn export ${srcRepoURL}${srcRepoBra} ${srcRepoBra} --username ${srcRepoUsr} --password ${srcRepoPwd} getResult getTime # 检查分支是否有效 [ -z "`ls ${srcRepoBra}`" ] && echo -e "${nowTime}${commitLogM[1]}源代码库分支中没有需要迁移的文件\n" >> ${commitLogs} && continue sleep 1 # 删除本地仓库目录(目标) cd ${desRepoDir} [ -d "${desRepoBra}" ] && getTime && rm -rf ${desRepoBra} && echo -e "${nowTime}${commitLogM[0]}已经删除之前下载的代码" >> ${commitLogs} getTime # 创建目标代码目录 svn mkdir --parents ${desRepoURL}${desRepoBra} --username ${desRepoUsr} --password ${desRepoPwd} [ $? -ne 0 ] && str="创建代码目录" || str="无法创建目录" && echo -e "${nowTime}${commitLogM[1]}${str}${desRepoURL}${desRepoBra}" >> ${commitLogs} getTime # 检出目标仓库代码 echo -e "${nowTime}${commitLogM[0]}开始检出代码${desRepoURL}${desRepoBra}" >> ${commitLogs} svn co ${desRepoURL}${desRepoBra} ${desRepoBra} --username ${desRepoUsr} --password ${desRepoPwd} getResult sleep 1 getTime # 检查目标仓库是否空 while [ -n "`ls ${desRepoBra}`" ] do read -p "目标仓库中已有文件?输入'Y'更新目标仓库,输入'N'跳过本条记录..." toNEXT [ "${toNEXT^^}" = "Y" ] || [ "${toNEXT^^}" = "N" ] && break done [ "${toNEXT^^}" = "N" ] && continue cd ${desRepoBra} # 复制代码至目标分支 echo -e "${nowTime}${commitLogM[0]}开始复制代码到目录${desRepoBra}" >> ${commitLogs} cp -rf ${srcRepoDir}/${srcRepoBra}/* ./ # 向代码库中添加代码 getTime echo -e "${nowTime}${commitLogM[0]}开始向代码库添加代码" >> ${commitLogs} svn add . --force --no-ignore --username ${desRepoUsr} --password ${desRepoPwd} getResult # 向代码库中提交代码 getTime echo -e "${nowTime}${commitLogM[0]}开始向代码库提交代码" >> ${commitLogs} svn ci -m "${commitLogM[4]}" . --username ${desRepoUsr} --password ${desRepoPwd} getResult getTime echo -e "${nowTime}${commitLogM[3]}代码已迁移至${desRepoURL}${desRepoBra}\n" >> ${commitLogs} # 标记迁移成功的项目记录 eval sed -i '"${lineNumber}s/^/#&/"' ${commitList} sleep 3 done |
原创文章禁止转载:技术学堂 » Subversion迁移仓库自动化脚本

技术学堂















