📦 仓库管理命令

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