svn可通过dump+filter+load组合实现版本库路径重构与目录平移并保留完整历史;先dump原库,再用svndumpfilter提取子目录、重写路径前缀,最后load至新库。

SVN本身不支持直接“重命名”或“移动”版本库根路径(比如把 https://svn.example.com/repo/a 变成 https://svn.example.com/repo/b),但可以通过 dump + filter + load 组合实现路径的无缝重构与目录平移,且完整保留历史、版本号、提交人和日志。
用 svndumpfilter 实现目录级平移
适用于将某个子目录(如 /trunk/web)整体迁移到新路径(如 /web 或另一个仓库的 /apps/web),同时剥离无关路径、修正路径前缀。
- 先完整导出原仓库:
svnadmin dump /path/to/oldrepo > full.dump - 过滤并重写路径:用
svndumpfilter include trunk/web --renumber-revs --drop-empty-revs提取内容,并通过--preserve-revprops保留言属性(作者、时间、日志) - 重写路径前缀:配合
svndumpfilter的--normalize-props和手动 sed(或使用svndumpfilter的--skip-missing-merge-sources避免断链),再用sed 's/^Node-path: trunk\/web$/Node-path: web/'替换路径头(注意需处理所有 Node-path、Node-copyfrom-path 等字段) - 导入到目标仓库:
svnadmin load /path/to/newrepo
跨仓库路径重构(含结构调整)
当需要把多个旧仓库的目录合并进一个新仓库的不同路径下(例如把 dev/web、dev/mobile 分别平移为 apps/web、apps/mobile),需分步处理:
《SVN视频教程》,SVN:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。许多人会把版本控制系統想像成某种“时光机器”。
- 对每个源仓库单独 dump,再用
svndumpfilter include dev/web提取 - 用脚本批量重写路径(推荐 Python 或 awk 处理 dump 文件中的
Node-path、Node-copyfrom-path、Text-content-md5等关联字段,避免校验失败) - 按目标顺序依次 load 到新仓库——SVN 允许多次 load 同一仓库,版本号自动递增,历史线性连续
- 加载完成后,用
svnlook youngest和svnlook tree验证结构与版本一致性
客户端无感切换的关键操作
路径变了,但开发者本地工作副本不能重检出——否则丢失本地修改和未提交变更。必须用 svn switch --relocate 或新版 svn relocate(1.8+)完成地址映射更新:
- 若只是仓库域名/端口变化(如 svn.internal → svn.prod),执行:
svn switch --relocate http://svn.internal/repo http://svn.prod/repo - 若路径前缀变化(如
/oldroot/app→/newroot/app),需先确保服务端已配置好新路径可访问,再运行:svn switch --relocate http://host/svn/oldroot http://host/svn/newroot - 执行后运行
svn info确认 URL 已更新,svn status -u检查是否能正常比对远程版本
注意事项与避坑点
dump/load 过程看似简单,但路径重构极易出错,尤其涉及 copy/move 历史时:
-
svndumpfilter默认会丢弃跨路径的 copy 源(如从/libcopy 到/trunk/web),需加--drop-empty-revs和--preserve-revprops,必要时用--skip-missing-merge-sources - 不要用普通文本编辑器直接改 dump 文件——二进制安全的换行、MD5 校验、增量压缩字段都可能被破坏;优先用
svndumpfilter+ 流式 sed/awk - 迁移后首次 commit 前,建议在测试目录运行
svn log -l 5和svn cat -r PREV 文件名验证历史可读性 - 权限配置需同步更新:新路径的 authz 规则、pre-commit hook 中的路径判断逻辑都要重新适配










