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