Svn 仓库定时同步到 Git

前言

前两年有个需求,需要将内网 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 "|======================================================================|"

# 获取今日与明日日期,用于筛选 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 来设置定时任务,在终端输入:

1
crontab -e

在打开的文件中添加如下一行定时任务内容,以实现每日凌晨 0 点自动执行同步脚本,并将执行日志输出至指定的日志文件:

1
0 0 * * * /svn-repository/sync-svn.sh >> /log/sync-svn.log

结语

此同步脚本设计较为简洁,尽管其实现方式略显粗糙,但胜在能够有效地解决 SVN 到 Git 的同步问题。在实际应用中,若对功能与性能有更高要求,可进一步对其进行优化与拓展,例如增加对多个 Git 仓库的支持、优化存储空间占用等。


Svn 仓库定时同步到 Git
https://blog.pangcy.cn/2024/11/22/服务器运维/Linux/Svn 仓库定时同步到 Git/
作者
子洋
发布于
2024年11月22日
许可协议