--- title: "08-SVN" created: 2026-03-16 tags: - SVN - 项目 aliases: - SVN --- # SVN ## **一、SVN 核心概念** ![[image-f10364cd.png]] ## **二、SVN vs Git 核心区别** | **特性** | **SVN** | **Git** | | --- | --- | --- | | 架构 | 集中式 | 分布式 | | 仓库 | 单一服务器 | 每人完整副本 | | 提交 | 需要联网 | 可离线提交 | | 分支 | 目录拷贝(重量级) | 轻量级指针 | | 版本号 | 递增整数(r1, r2...) | SHA-1 哈希 | | 权限控制 | 精细到目录/文件 | 仓库级别 | ## **三、基础命令速查** ### **仓库与工作区** ```bash # 检出仓库(建立工作副本) svn checkout https://svn.example.com/repos/project ./myproject svn co https://svn.example.com/repos/project/trunk ./myproject # 只检出 trunk # 查看仓库信息 svn info svn info https://svn.example.com/repos/project # 查看状态 svn status # 本地修改状态 svn status -v # 详细信息(含版本号) svn status -u # 对比服务器最新版本 ``` ### **获取更新** ```bash # 更新工作副本 svn update # 更新到最新版本 svn update -r 100 # 更新到指定版本 svn up # 简写 ``` ### **提交变更** ```bash # 添加文件到版本控制 svn add newfile.txt svn add newdir/ # 添加目录(递归) svn add *.java # 通配符 # 删除文件 svn delete oldfile.txt svn rm oldfile.txt # 简写 # 提交 svn commit -m "提交说明" svn ci -m "fix: 修复登录bug" # 简写 ``` ### **查看历史与差异** ```bash # 查看日志 svn log # 所有历史 svn log -l 10 # 最近10条 svn log -r 100:200 # 指定版本范围 svn log -v # 详细(含文件列表) # 查看差异 svn diff # 与基础版本比较 svn diff -r 100 # 与版本100比较 svn diff -r 100:200 # 两个版本间差异 svn diff file.txt # 指定文件差异 ``` ## **四、分支与标签** ### **SVN 标准目录结构** ```text repository/ ├── trunk/ # 主开发线 ├── branches/ # 功能/修复分支 │ ├── feature-login/ │ └── hotfix-v1.2/ └── tags/ # 发布快照(只读) ├── v1.0/ └── v2.0/ ``` ### **分支操作命令** ```bash # 创建分支(从 trunk 复制) svn copy https://svn.example.com/repos/trunk \ https://svn.example.com/repos/branches/feature-login \ -m "创建登录功能分支" # 切换到分支 svn switch https://svn.example.com/repos/branches/feature-login # 查看当前分支 svn info | grep URL # 合并分支到 trunk cd trunk工作副本 svn merge https://svn.example.com/repos/branches/feature-login svn commit -m "合并 feature-login 分支" # 查看合并信息 svn mergeinfo https://svn.example.com/repos/branches/feature-login # 创建 Tag(发布快照) svn copy https://svn.example.com/repos/trunk \ https://svn.example.com/repos/tags/v1.0 \ -m "发布 v1.0 版本" ``` ## **五、冲突处理** ```bash # 更新时遇到冲突,会生成以下文件: # file.txt ← 含冲突标记的文件 # file.txt.mine ← 你的本地版本 # file.txt.r100 ← 旧的基础版本 # file.txt.r101 ← 服务器最新版本 # 手动解决冲突后标记为已解决 svn resolve --accept=working file.txt # 快速解决:选择哪个版本 svn resolve --accept=mine-full file.txt # 用本地版本 svn resolve --accept=theirs-full file.txt # 用服务器版本 # 放弃本地修改,恢复到服务器版本 svn revert file.txt svn revert -R . # 递归恢复所有修改 ``` ## **六、状态符号说明** | **符号** | **含义** | | --- | --- | | `M` | 已修改 (Modified) | | `A` | 已添加 (Added) | | `D` | 已删除 (Deleted) | | `C` | 冲突 (Conflict) | | `?` | 未纳入版本控制 | | `!` | 文件丢失 | | `I` | 被忽略 (Ignored) | | `R` | 已替换 (Replaced) | | `X` | 外部引用 | --- ## **七、常用进阶操作** ```bash # 设置忽略文件(类似 .gitignore) svn propset svn:ignore "*.class" . svn propset svn:ignore -F .svnignore . # 查看属性 svn proplist svn propget svn:ignore . # 锁定文件(二进制文件防并发编辑) svn lock image.psd -m "我在编辑此文件" svn unlock image.psd # 查看某版本的文件内容 svn cat -r 100 file.txt # 查看远程目录结构 svn list https://svn.example.com/repos/ svn list -v # 详细信息 # 导出(不含 .svn 目录) svn export https://svn.example.com/repos/trunk ./export_dir # 撤销已提交的版本(反向合并) svn merge -r 105:104 file.txt # 撤销 r105 的修改 svn commit -m "撤销 r105 的修改" ``` ## **八、典型工作流程** ![[image-d0643f5c.png]] ## **九、服务器搭建速览** ```bash # 方式1:svnserve(内置,轻量) svnadmin create /opt/repos/myproject # 创建仓库 svnserve -d -r /opt/repos # 启动服务(默认端口3690) # 访问:svn://hostname/myproject # 方式2:通过 Apache(http/https,推荐生产) # 配置 mod_dav_svn 模块 # 配置用户权限 vi /opt/repos/myproject/conf/svnserve.conf vi /opt/repos/myproject/conf/passwd vi /opt/repos/myproject/conf/authz ``` ## **十、快速参考卡片** ```text 常用命令助记: co = checkout 检出 up = update 更新 ci = commit 提交 st = status 状态 di = diff 差异 rm = delete 删除 mv = rename 重命名 黄金工作流: update → 修改 → add/delete → diff确认 → commit ``` --- > 💡 **学习建议**: > > 1. 先掌握 `checkout → update → commit` 基础循环 > 2. 再学会处理**冲突**(团队协作核心) > 3. 理解 **trunk/branches/tags** 结构 > 4. 推荐工具:**TortoiseSVN**(Windows图形界面)、**Subclipse**(Eclipse插件)、**IDEA内置SVN支持** --- **项目分区导航**:[[07-贡献代码到开源项目从Fork到PR|贡献代码到开源项目从Fork到PR]] ⬅️ | 08-SVN(本组末篇)➡️ [[00-Linux总览|00-Linux总览]]