如何将SVN服务器仓库每日备份至另一台PC?
靠谱的SVN每日自动跨PC备份方案
我来给你梳理一套实操性强的方案,既能继续用现有PC当SVN服务器,又能把仓库每日自动备份到另一台PC,全程不用手动操心:
第一步:编写SVN仓库的本地备份脚本
首先得把SVN仓库完整备份到本地临时目录,推荐用svnadmin hotcopy工具——它支持在线热备份,不用停SVN服务,特别适合你的场景。
如果你用的是Windows服务器:
新建一个svn_backup.bat脚本,内容如下:
@echo off set "SVN_REPO_PATH=D:\svn\your_repo" # 替换成你的SVN仓库实际路径 set "LOCAL_BACKUP_DIR=D:\svn_backups\temp" # 本地临时备份目录 set "DATE=%date:~0,4%%date:~5,2%%date:~8,2%" # 生成YYYYMMDD格式的日期 :: 创建临时备份目录 if not exist "%LOCAL_BACKUP_DIR%" mkdir "%LOCAL_BACKUP_DIR%" :: 执行热备份 svnadmin hotcopy "%SVN_REPO_PATH%" "%LOCAL_BACKUP_DIR%\repo_backup_%DATE%" :: 压缩备份文件(可选,节省空间) 7z a -tzip "%LOCAL_BACKUP_DIR%\repo_backup_%DATE%.zip" "%LOCAL_BACKUP_DIR%\repo_backup_%DATE%" rd /s /q "%LOCAL_BACKUP_DIR%\repo_backup_%DATE%" # 删除未压缩的目录
注意:如果用压缩的话,得先安装7-Zip,把它的路径加到系统环境变量里
如果你用的是Linux服务器:
新建一个svn_backup.sh脚本,内容如下:
#!/bin/bash SVN_REPO_PATH="/var/svn/your_repo" # 替换成你的SVN仓库实际路径 LOCAL_BACKUP_DIR="/var/svn_backups/temp" DATE=$(date +%Y%m%d) # 创建临时备份目录 mkdir -p $LOCAL_BACKUP_DIR # 执行热备份 svnadmin hotcopy $SVN_REPO_PATH $LOCAL_BACKUP_DIR/repo_backup_$DATE # 压缩备份文件 tar -zcvf $LOCAL_BACKUP_DIR/repo_backup_$DATE.tar.gz $LOCAL_BACKUP_DIR/repo_backup_$DATE rm -rf $LOCAL_BACKUP_DIR/repo_backup_$DATE
然后给脚本加执行权限:chmod +x svn_backup.sh
第二步:把备份文件同步到另一台PC
接下来要把本地备份好的文件传到目标PC,分两种系统场景:
Windows到Windows:
- 在目标PC上新建一个文件夹,右键选择「属性」→「共享」,开启共享权限,设置允许SVN服务器的PC访问(最好用特定账号,别开匿名)
- 在SVN服务器PC上,把目标PC的共享文件夹映射成网络驱动器(比如Z:盘)
- 修改刚才的
svn_backup.bat,最后加一行:
copy "%LOCAL_BACKUP_DIR%\repo_backup_%DATE%.zip" "Z:\svn_backups\"
或者用robocopy替代copy,它更稳定,支持断点续传:robocopy "%LOCAL_BACKUP_DIR%" "Z:\svn_backups" "repo_backup_%DATE%.zip" /R:3 /W:5
Linux到Linux/Windows:
- 如果目标是Linux:用
rsync配合SSH免密登录,在备份脚本最后加一行:
rsync -avz $LOCAL_BACKUP_DIR/repo_backup_$DATE.tar.gz user@目标PC_IP:/path/to/backup/folder/
先在SVN服务器上生成SSH密钥,传到目标PC,实现免密登录(ssh-keygen然后ssh-copy-id user@目标PC_IP)
- 如果目标是Windows:可以在目标PC开启SFTP服务,用
lftp或者pscp命令把备份文件传过去,或者挂载Windows共享目录到Linux上再复制。
第三步:设置定时自动执行
最后一步让脚本每天自动跑,不用手动操作:
Windows系统:
- 打开「任务计划程序」→「创建基本任务」
- 任务名称填「SVN每日备份」,触发器选「每天」,设置你想要的备份时间(比如凌晨2点,服务器负载低的时候)
- 操作选「启动程序」,程序或脚本选刚才的
svn_backup.bat,起始位置填脚本所在的文件夹路径 - 勾选「不管用户是否登录都要运行」,并设置最高权限,避免权限问题
Linux系统:
- 编辑crontab:
crontab -e - 加一行定时任务,比如每天凌晨2点执行:
0 2 * * * /path/to/svn_backup.sh >> /var/log/svn_backup.log 2>&1
这行的意思是每天2点0分执行脚本,把日志输出到svn_backup.log里,方便后续排查问题
额外的安全小建议
- 定期检查备份日志,确保脚本没有报错
- 每月做一次恢复测试:把备份文件恢复到测试环境,确认仓库能正常使用
- 给备份文件设置保留期限,比如只保留最近7天的备份,避免占满磁盘(可以在脚本里加删除旧文件的逻辑,比如Windows用
forfiles,Linux用find命令)
内容的提问来源于stack exchange,提问作者Vishal Rathod




