svnadmin load 不支持直接导入到子目录,需预处理 dump 文件重写路径前缀(如将 / 改为 /myproject/),推荐用 svndumpfilter 或 svntool;加载前确保目标仓库为空,加载后验证完整性与历史。

svnadmin load 本身不支持直接将 dump 文件导入到指定子目录(比如 /trunk/projectA),它默认总是从仓库根路径开始还原。但可以通过预处理 dump 文件,重写路径前缀,实现“导入到子目录”的效果。
核心思路:用 svnadmin dump + svndumpfilter 或 svntool 修改路径前缀
要让 dump 数据最终出现在 /myproject 下,需在加载前把所有路径(如 /、/src、/docs)重写为 /myproject/、/myproject/src、/myproject/docs。
- 推荐使用
svndumpfilter(Subversion 自带)或更可靠的svntool(第三方,支持前缀注入) - 若 dump 文件来自完整仓库,先用
svndumpfilter include --drop-empty-revs --renumber-revs .提取根路径内容,再重写前缀 - 关键命令示例(将 dump 内容整体移入
/myproject):
svndumpfilter --drop-empty-revs --renumber-revs include / repo-into-myproject.dump
⚠️ 注意:sed 方式简单但有风险(可能误改二进制内容或注释行),仅适用于纯 ASCII dump 且无特殊字符的场景;生产环境建议用 svntool rewrite-prefix 或 Python 脚本精确处理。
创建空目标仓库并加载重写后的 dump
确保目标仓库已存在且为空(或全新初始化):
svnadmin create /path/to/newreposvnadmin load /path/to/newrepo
加载完成后,svn list file:///path/to/newrepo/myproject 即可看到原 dump 中的内容。
替代方案:用 svn import + svn mkdir 模拟(适合小数据)
如果 dump 数据量不大,且原结构简单,可解包 dump(用 svnadmin dump --incremental 配合解析工具导出文件),再通过工作副本操作:
- 检出目标仓库根:
svn co file:///path/to/repo wc - 在工作副本中创建子目录:
svn mkdir wc/myproject - 把原始项目文件复制进
wc/myproject/,然后svn add并svn commit
此法无法保留历史版本和作者信息,仅适用于迁移快照。
验证与注意事项
- 加载前务必备份 dump 文件和目标仓库
- 用
svnadmin verify检查新仓库完整性 - 检查日志:
svn log -l 5 file:///path/to/repo/myproject确认提交历史正确挂载 - 若 dump 含分支/标签(
/branches),需统一重写全部路径,否则引用关系会断裂
不复杂但容易忽略细节,关键是路径重写必须覆盖 Node-path、Node-copyfrom-path 和 Path(在 revision header 中)三处字段。











