svndumpfilter 主要功能
1. 路径过滤
# 只包含指定路径
svndumpfilter include trunk/HRproject < full.dump > filtered.dump
# 排除指定路径
svndumpfilter exclude branches/experimental < full.dump > filtered.dump
# 包含多个路径
svndumpfilter include trunk/HRproject trunk/OtherProject < full.dump > filtered.dump
2. 重新编号版本
# 重新编号版本号(从1开始)
svndumpfilter --renumber-revs include "" < perfor.dump > renumbered.dump
# 重新编号并删除空版本
svndumpfilter --renumber-revs --drop-empty-revs include "" < perfor.dump > clean.dump
3. 保留版本属性
# 保留作者、日期等版本属性
svndumpfilter --preserve-revprops include trunk/HRproject < full.dump > filtered.dump
🔄 工作流程示例
从 svnrdump 导出到 svndumpfilter 处理
# 1. 使用 svnrdump 导出远程项目
svnrdump dump http://example.com/svn/repo/trunk/HRproject > hrproject.dump
# 2. 使用 svndumpfilter 重新编号
svndumpfilter --renumber-revs include "" < hrproject.dump > renumbered.dump
# 3. 加载到新仓库
svnadmin create new-repo
svnadmin load new-repo < renumbered.dump
# 版本号从1开始!
📊 svndumpfilter 常用参数
| 参数 |
说明 |
示例 |
include <路径> |
只包含指定路径 |
include trunk/HRproject |
exclude <路径> |
排除指定路径 |
exclude .svn |
--renumber-revs |
重新编号版本号 |
--renumber-revs |
--drop-empty-revs |
删除空版本 |
--drop-empty-revs |
--preserve-revprops |
保留版本属性 |
--preserve-revprops |
--quiet |
静默模式 |
--quiet |
--skip-missing-merge-sources |
跳过缺失的合并源 |
--skip-missing-merge-sources |
快捷方法
# 导出指定路径的项目
svnrdump dump svn://192.168.1.100/var/svn/repositories/base/project/new/project01 > project01.dump
# 如果需要过滤控制
svnadmin dump /var/svn/repositories/base | \
svndumpfilter include project/new/project01 --drop-empty-revs --renumber-revs > project01.dump
# 加载到空仓库
svnadmin create project01-standalone
svnadmin load project01-standalone < project01.dump
# 加载到现有仓库的 /projectB 目录下(使用 --parent-dir 指定不同路径)
svnadmin load existing-repo --parent-dir /projectB < projectB.dump
svnadmin load /home/svn/testDemo/ --parent-dir /trunk < perfor.dump
# 默认情况:dump 文件的 UUID 必须与目标仓库匹配
svnadmin load repo < dumpfile # 如果UUID不同会失败
# 使用 --ignore-uuid 忽略检查
svnadmin load repo --ignore-uuid < dumpfile
# 使用 --force-uuid 强制使用 dump 的 UUID(危险!)
svnadmin load repo --force-uuid < dumpfile
方法1:检出后转成Git,再导出
# 1. 检出项目到本地
svn checkout svn://192.168.1.100/svn/base/project/new/project01 project01-local
# 2. 转换为Git仓库(保留历史)
cd project01-local
svn2git . --rootistrunk --authors ../authors.txt
# 或者用git-svn
git svn clone file://$(pwd) --stdlayout --no-metadata ../project01-git
# 3. (可选)推送到Git服务器,或直接使用Git
方法2:检出后用svnadmin dump本地仓库
# 1. 创建本地文件系统仓库
svnadmin create /tmp/project01-local-repo
# 2. 检出远程项目
svn checkout svn://192.168.1.100/svn/base/project/new/project01 /tmp/project01-checkout
# 3. 导入到本地仓库
svn import /tmp/project01-checkout file:///tmp/project01-local-repo -m "初始导入"
# 4. 从本地仓库创建dump
svnadmin dump /tmp/project01-local-repo > project01.dump
# 5. 清理
rm -rf /tmp/project01-local-repo /tmp/project01-checkout
方法3:检出后创建新SVN仓库(会丢失历史 ❌)
# 这会丢失所有提交历史,只保留最新代码!
svn checkout svn://192.168.1.100/svn/base/project/new/project01 project01-checkout
svnadmin create project01-new
svn import project01-checkout file:///var/svn/repositories/project01-new -m "初始导入"
方法4:最完整的方案(保留历史)
# 1. 在服务器上执行完整dump
# 如果你能访问服务器
svnadmin dump /var/svn/repositories/base > /tmp/base-full.dump
# 2. 复制到本地
scp user@server:/tmp/base-full.dump .
# 3. 本地过滤
svndumpfilter include project/new/project01 \
--drop-empty-revs \
--renumber-revs \
< base-full.dump > project01.dump