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