svn服务端断电会导致仓库损坏,需修复db/current、db/revs和db/revprops等文件:先备份,将current回退至上一有效版本号(如19955),删除对应损坏版本的revprops及locks文件,重启服务后重新执行合并操作。

SVN合并过程中遭遇断电,通常不会直接损坏工作副本(WC),但可能造成服务端仓库(repository)损坏,进而引发后续合并失败、版本号错乱或“Invalid filesystem revision number”等错误。真正需要修复的是服务器端的 Subversion 仓库数据结构,而非客户端的合并操作本身。
先确认问题发生在哪一端
断电影响分两类:
-
客户端断电:仅导致本地工作副本状态异常(如未完成的 merge 操作残留),一般通过
svn cleanup+svn revert或重新svn update即可恢复,不影响仓库一致性; -
服务端断电:这才是数据不一致的根源——
db/current文件被写入新版本号(如 19956),但对应的db/revs/19/19956或db/revprops/19956文件未完整生成或内容损坏,导致 SVN 无法解析该版本,后续所有操作(包括 merge)都会报错。
修复服务端仓库的核心步骤
操作前务必完整备份整个仓库目录(如 D:\svnroot\myrepo)。
《SVN视频教程》,SVN:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。许多人会把版本控制系統想像成某种“时光机器”。
- 进入仓库根目录的
db/子目录; - 打开
current文件,查看当前记录的版本号(例如显示19956 4nr6 i); - 进入
db/revs/目录,逐层查找最高编号的完整版本文件(如db/revs/19/19955存在且可读,而19956缺失或为空); - 将
current文件内容改为上一个有效版本号(如改为19955,末尾保留换行); - 检查
db/revprops/和db/locks/目录,删除与损坏版本号(19956)对应的所有文件或子目录(如db/revprops/19956、db/locks/580/580c93793d2f9df159ce7f1c5de5862c); - 重启 SVN 服务(如 svnserve 或 Apache);
- 用
svn info和svn log -l 5验证最新版本是否已回退到 19955 且可正常访问。
合并操作需重新执行
修复仓库后,之前中断的合并任务不会自动续上,必须人工重做:
- 在目标分支工作副本中执行
svn update,确保基于最新可用版本(19955); - 使用明确版本范围重新发起合并,例如:
svn merge -r 19950:19955 https://svn.example.com/repo/branches/feature; - 若原合并尚未提交,先用
svn revert --depth=infinity .清理残留冲突标记; - 合并后逐个检查
svn status输出的C(内容冲突)和!(树冲突)状态,手动解决并svn resolve --accept=working标记; - 测试通过后再
svn commit。
预防比修复更重要
避免同类问题反复发生:
- 为 SVN 服务器配置 UPS,杜绝意外断电;
- 定期执行
svnadmin verify检查仓库完整性; - 启用
fsfs.conf中的enable-auto-compact = true(FSFS 格式下)提升健壮性; - 关键合并前用
svn merge --dry-run预演,确认无高风险冲突; - 考虑迁移至 Git——其分布式设计天然规避单点仓库损坏风险。










