前言
前两年有个需求,需要将内网 SVN 仓库通过跳板机定时同步至 Git,现在这个功能已经不用了,但为了便于日后查阅与参考,特撰写此文以作记录。
实现定时同步
受限于当时的技术水平与时间限制,只选择了最简单的实现方式,在跳板机上同时安装部署 Svn 和 Git,借助定时任务定期执行 Svn 更新操作,随后执行 Git 提交操作。此方案的优势在于,当多仓库的 SVN 服务在新增仓库时,无需在 Git 端另行创建新仓库;然而其缺点也很明显,仅存在一个 Git 仓库,且跳板机因同步仓库操作而占用一定的存储空间。
同步脚本
首先创建一个专用目录,用于存放所有的 SVN 仓库。在此目录下创建名为 sync-svn.sh
的脚本文件,其内容如下:
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
| #!/bin/bash
timer=$(date "+%Y-%m-%d %H:%M:%S") echo "|======================================================================|" echo "|================== $timer 同步任务开始 ==================|" echo "|======================================================================|"
today=$(date "+%Y-%m-%d") tomorrow=$(date -d "1 days" "+%Y-%m-%d")
syncSvn(){ echo "开始同步仓库 $1"
svn update
log="$(svn log -r {$today}:{$tomorrow})"
git add --all.
git commit -a -m "feat: $timer sync repository" -m "$log"
git push origin sync
echo "$1 仓库同步完成." }
dir=$(cd $(dirname $0); pwd)
cd $dir/repo1 && syncSvn repo1
cd $dir/repo2 && syncSvn repo2
timer=$(date "+%Y-%m-%d %H:%M:%S") echo "|======================================================================|" echo "|================== $timer 同步任务结束 ==================|" echo "|======================================================================|" echo -e "\n"
|
定时任务
利用 corntab
来设置定时任务,在终端输入:
在打开的文件中添加如下一行定时任务内容,以实现每日凌晨 0 点自动执行同步脚本,并将执行日志输出至指定的日志文件:
1
| 0 0 * * * /svn-repository/sync-svn.sh >> /log/sync-svn.log
|
结语
此同步脚本设计较为简洁,尽管其实现方式略显粗糙,但胜在能够有效地解决 SVN 到 Git 的同步问题。在实际应用中,若对功能与性能有更高要求,可进一步对其进行优化与拓展,例如增加对多个 Git 仓库的支持、优化存储空间占用等。