📦 仓库管理命令
1. 仓库创建与管理
# 创建新仓库
svnadmin create /path/to/repository
# 仓库热备份(推荐)
svnadmin hotcopy /path/to/repo /path/to/backup-repo
# 验证仓库完整性
svnadmin verify /path/to/repository
# 查看仓库信息
svn info file:///path/to/repo
2. 数据导出与导入
# 从本地仓库导出(全量备份)
svnadmin dump /path/to/repo > backup.dump
# 导出特定版本范围
svnadmin dump /path/to/repo -r 100:200 > partial.dump
# 增量导出
svnadmin dump /path/to/repo -r 100:200 --incremental > inc.dump
# 从远程仓库导出
svnrdump dump http://svn.example.com/repo > remote.dump
# 导入数据到仓库
svnadmin load /path/to/new-repo < backup.dump
# 导入到指定目录
svnadmin load /path/to/repo --parent-dir /new-project < project.dump
📁 日常开发命令
1. 检出与更新
# 检出整个仓库
svn checkout http://svn.example.com/repo/trunk myproject
svn co URL [PATH] # 简写
# 检出特定目录
svn checkout http://svn.example.com/repo/trunk/src src-folder
# 更新工作副本
svn update
svn up # 简写
# 更新到特定版本
svn update -r 100
svn up -r HEAD # 更新到最新
# 查看更新日志(不实际更新)
svn update --dry-run
# 移动目录
# 使用 ^ 表示仓库根相对路径
svn move \
^/base/trunk/trunk/HRproject/old/hr/newperformance/code/performance \
^/base/trunk/performance \
-m "移动目录"
# 如果仓库根目录是 /base
svn move \
svn://127.0.0.1:8888/base/trunk/trunk/HRproject/old/hr/newperformance/code/performance \
svn://127.0.0.1:8888/base/trunk/performance \
-m "移动目录"
# 删除目录
svn delete svn://127.0.0.1:8888/base/trunk/trunk -m "删除trunk/trunk目录"
2. 提交与修改
# 提交更改
svn commit -m "提交说明"
svn ci -m "fix bug #123" # 简写
# 提交特定文件
svn commit file1.txt file2.c -m "修改说明"
# 添加新文件
svn add newfile.txt
svn add *.java # 添加所有java文件
svn add folder/ --force # 强制添加非空目录
# 删除文件
svn delete file.txt
svn del file.txt # 简写
svn rm file.txt # 简写
# 重命名/移动
svn move oldname.txt newname.txt
svn mv src/ dest/ # 简写
# 复制文件(用于分支)
svn copy source.txt dest.txt -m "复制说明"
3. 状态与差异
# 查看工作副本状态
svn status
svn st # 简写
# 状态代码说明:
# ? 未版本控制的文件
# A 已添加
# D 已删除
# M 已修改
# C 冲突
# ! 丢失或被删除
# ~ 版本控制但类型改变
# 查看详细状态
svn status -v # 显示版本号
svn status -u # 检查服务器更新
# 查看文件差异
svn diff
svn di # 简写
# 比较特定文件
svn diff file.txt
# 与特定版本比较
svn diff -r 100:105 file.txt
svn diff -r PREV:HEAD file.txt # 与上一版本比较
# 查看谁修改了哪一行
svn blame file.txt
svn praise file.txt # 别名
svn annotate file.txt # 别名
🔍 信息查询命令
1. 日志查看
# 查看提交日志
svn log
# 查看特定文件日志
svn log file.txt
# 限制日志数量
svn log -l 10 # 最近10条
svn log -l 5 file.txt
# 查看特定版本范围
svn log -r 100:200
svn log -r {2023-01-01}:{2023-12-31}
# 详细日志(显示修改文件)
svn log -v
svn log -v -r 100:105
# XML格式输出
svn log --xml
# 搜索日志
svn log --search "bug fix"
2. 列表与信息
# 列出仓库内容
svn list http://svn.example.com/repo
svn ls URL # 简写
# 递归列出
svn list -R http://svn.example.com/repo
# 查看详细信息
svn list --verbose http://svn.example.com/repo
# 输出:权限 版本 作者 大小 日期 名称
# 查看文件/目录信息
svn info file.txt
svn info . # 当前目录信息
svn info http://svn.example.com/repo # 远程信息
# 查看属性
svn propget svn:keywords file.txt
svn pg svn:keywords file.txt # 简写
# 列出所有属性
svn proplist file.txt
svn pl file.txt # 简写
# 显示属性值
svn proplist -v file.txt
🌿 分支与标签管理
1. 创建分支/标签
# 从trunk创建分支
svn copy http://svn.example.com/repo/trunk \
http://svn.example.com/repo/branches/feature-x \
-m "创建feature-x分支"
# 从特定版本创建
svn copy -r 100 http://svn.example.com/repo/trunk \
http://svn.example.com/repo/branches/old-version \
-m "基于版本100创建分支"
# 创建标签(推荐在tags目录)
svn copy http://svn.example.com/repo/trunk \
http://svn.example.com/repo/tags/v1.0.0 \
-m "发布v1.0.0标签"
2. 切换与合并
# 切换到分支
svn switch http://svn.example.com/repo/branches/feature-x
svn sw http://svn.example.com/repo/branches/feature-x
# 切换回trunk
svn switch http://svn.example.com/repo/trunk
# 查看当前分支URL
svn info --show-item url
# 合并分支到trunk
svn merge http://svn.example.com/repo/branches/feature-x
svn merge ^/branches/feature-x # 使用相对URL
# 合并特定版本范围
svn merge -r 100:150 http://svn.example.com/repo/branches/feature-x
# 撤销合并
svn merge -c -123 . # 撤销版本123的更改
# 查看合并信息
svn mergeinfo http://svn.example.com/repo/branches/feature-x
svn mergeinfo --show-revs eligible ^/branches/feature-x
⚠️ 冲突解决
1. 冲突检测与处理
# 更新时出现冲突
svn update
# 冲突文件会有 .mine, .rOLD, .rNEW 后缀
# 查看冲突文件状态
svn status
# C 表示冲突
# 手动编辑解决冲突后标记解决
svn resolved conflicted-file.txt
# 使用我的版本覆盖
svn resolve --accept mine-full conflicted-file.txt
# 使用他人版本覆盖
svn resolve --accept theirs-full conflicted-file.txt
# 查看冲突详情
svn diff --diff-cmd diff -x "--side-by-side" conflicted-file.txt
2. 冲突预防
# 更新前查看状态
svn status -u
# 锁定文件(防止他人修改)
svn lock file.txt -m "正在修改此文件"
# 查看锁状态
svn lock list
# 解锁文件
svn unlock file.txt
# 强制解锁(需要权限)
svn unlock --force file.txt
🔧 高级操作
1. 属性管理
# 设置属性
svn propset svn:keywords "Date Rev Author" file.txt
svn ps svn:keywords "Date Rev Author" file.txt
# 设置执行权限
svn propset svn:executable "*" script.sh
# 设置MIME类型
svn propset svn:mime-type "text/html" index.html
# 忽略文件
svn propset svn:ignore "*.class
*.log
target/" .
# 编辑属性
svn propedit svn:ignore .
svn pe svn:ignore . # 简写
# 删除属性
svn propdel svn:keywords file.txt
svn pd svn:keywords file.txt # 简写
2. 清理与修复
# 清理工作副本
svn cleanup
# 恢复删除的文件
svn revert deleted-file.txt
# 恢复所有修改
svn revert -R . # 递归恢复
# 导出纯净副本(无.svn目录)
svn export http://svn.example.com/repo/trunk exported-folder
svn export . ../clean-copy # 从工作副本导出
# 导入新项目
svn import myproject http://svn.example.com/repo/new-project -m "初始导入"
3. 版本回退
# 回退到特定版本
svn update -r 100
# 回退单个文件
svn update -r 100 file.txt
# 永久回退(提交回退)
svn merge -r HEAD:100 file.txt
svn commit -m "回退到版本100"
📊 实用查询组合
1. 查看工作副本状态摘要
# 查看修改统计
svn status | awk '{print $1}' | sort | uniq -c
# 查看即将提交的文件
svn status | grep -E '^[AMD]'
# 查看未版本控制的文件
svn status | grep '^?'
2. 版本信息查询
# 查看当前版本号
svn info --show-item revision
# 查看最后修改版本
svn log -l 1 --oneline
# 查看文件修改历史(简洁)
svn log file.txt --oneline -l 20
3. 批量操作
# 批量添加所有未版本控制的文件
svn status | grep '^?' | awk '{print $2}' | xargs svn add
# 批量删除所有已删除的文件
svn status | grep '^!' | awk '{print $2}' | xargs svn delete
# 批量还原所有修改
svn status | grep '^M' | awk '{print $2}' | xargs svn revert
🌐 网络操作
1. 认证与代理
# 缓存认证信息
svn checkout --username yourname --password yourpass URL
# 不缓存密码(交互式输入)
svn checkout --username yourname --no-auth-cache URL
# 使用配置目录
svn --config-dir ~/.mysvnconfig checkout URL
# 设置代理
export http_proxy=http://proxy-server:8080
export https_proxy=http://proxy-server:8080
2. SSL配置
# 接受永久SSL证书
svn checkout --trust-server-cert URL
# 指定证书文件
svn checkout --config-option servers:global:ssl-client-cert-file=/path/cert.pem URL
📝 实用别名配置
在 ~/.bashrc 或 ~/.zshrc 中添加:
# SVN别名
alias svnst='svn status'
alias svnup='svn update'
alias svnci='svn commit'
alias svndi='svn diff'
alias svnlog='svn log --oneline -l 20'
alias svnls='svn list'
alias svninf='svn info'
# 查看冲突文件
alias svncon='svn status | grep "^C"'
# 查看需要添加的文件
alias svnadd='svn status | grep "^?" | cut -c 9-'
# 简洁状态显示
alias svnsts='svn status --ignore-externals'
🚨 紧急情况处理
1. 工作副本损坏
# 备份工作副本
cp -R myproject myproject-backup
# 清理并更新
svn cleanup
svn update --force
# 如果仍失败,重新检出
svn checkout http://svn.example.com/repo/trunk myproject-new
# 手动复制修改的文件
2. 误提交恢复
# 查看错误提交
svn log -l 5
# 创建反向修改
svn merge -c -123 . # 撤销版本123
svn commit -m "撤销版本123的更改"
# 或回滚到之前版本
svn merge -r 125:124 .
svn commit -m "回滚到版本124"
📋 常用工作流程
1. 日常开发流程
# 开始新功能
svn update
svn copy ^/trunk ^/branches/feature-xxx -m "创建新功能分支"
svn switch ^/branches/feature-xxx
# 开发中...
svn add new-file.java
svn commit -m "实现xxx功能"
svn update
# 完成功能,合并回主干
svn switch ^/trunk
svn update
svn merge ^/branches/feature-xxx
svn commit -m "合并feature-xxx分支"
2. 发布流程
# 创建发布分支
svn copy ^/trunk ^/branches/release-1.0 -m "创建1.0发布分支"
# 修复bug
svn switch ^/branches/release-1.0
# ... 修复bug ...
svn commit -m "修复bug #123"
# 创建标签
svn copy ^/branches/release-1.0 ^/tags/v1.0.0 -m "发布v1.0.0"
# 合并修复到主干
svn switch ^/trunk
svn merge ^/branches/release-1.0
svn commit -m "合并发布分支的修复"
🎯 快速参考卡片
| 操作 | 命令 | 简写 |
|---|---|---|
| 检出 | svn checkout URL |
svn co |
| 更新 | svn update |
svn up |
| 提交 | svn commit -m "msg" |
svn ci |
| 状态 | svn status |
svn st |
| 差异 | svn diff |
svn di |
| 日志 | svn log |
- |
| 添加 | svn add file |
- |
| 删除 | svn delete file |
svn del/svn rm |
| 移动 | svn move src dest |
svn mv |
| 复制 | svn copy src dest |
svn cp |
SVN 服务默认使用 3690 端口
# 启动时指定端口
svnserve -d -r /svn/repos --listen-port 3691
# -d:守护进程模式
# -r:仓库根目录
# --listen-port:指定端口
svn mkdir -m "初始化" \
file:///home/svn/base/trunk \
file:///home/svn/base/branches \
file:///home/svn/base/tags