SVN 总结(十四)

14.总结

一、SVN 核心概念

概念 说明
Repository(版本库) 中央存放所有代码及历史的地方
Checkout(检出) 从版本库首次获取工作副本
Commit(提交) 将本地修改上传到版本库(原子操作)
Update(更新) 将工作副本与版本库最新状态同步
Working Copy(工作副本) 本地可编辑的私有空间
Revision(版本号) 全局递增的数字,标识每次提交
Branch(分支) 从主线分离出的独立开发线
Tag(标签) 特定版本的快照,通常用于里程碑

二、SVN 生命周期

创建版本库 → 检出 → 更新 → 修改 → 复查 → 提交
                ↑___________________|
                     (循环迭代)

三、常用命令汇总

3.1 基本操作

操作 命令示例 说明
创建版本库 svnadmin create /path/to/repo 服务器端执行
启动服务 svnserve -d -r /svn_root --listen-port 3690 -d​ 守护进程,-r 指定根目录
检出 svn checkout svn://host/repo --username=user 缩写 svn co
更新 svn update 缩写 svn up
添加 svn add filename 将文件加入版本控制(待提交)
提交 svn commit -m "log message" 缩写 svn ci
查看状态 svn status 显示工作副本变更状态
查看差异 svn diff 比较本地与副本差异
撤销未提交修改 svn revert filename 不可逆,丢失本地修改
查看日志 svn log -r 1:10 -v -v 显示修改路径
查看文件内容(特定版本) svn cat -r 3 file.txt 不比较,直接输出
列出目录 svn list svn://host/repo 不检出仅查看

3.2 分支与标签

操作 命令
创建分支 svn copy trunk/ branches/my_branch
创建标签 svn copy trunk/ tags/v1.0
合并分支到主干 cd trunk && svn merge ../branches/my_branch
提交分支/标签 svn commit -m "create branch/tag"

注意:分支和标签本质都是 svn copy​,区别在于用途:分支后续会继续修改并可能合并回主干;标签通常固定不变。

3.3 版本回退(撤销已提交版本)

# 反向合并(生成一个新版本来回退)
svn merge -r 当前版本:目标版本 file
svn commit -m "revert to revision X"

示例:当前版本 22,想撤销到版本 21
svn merge -r 22:21 readme​ → svn commit

3.4 解决冲突

  1. 更新触发冲突svn update​ 后出现 C 状态

  2. 选择处理方式

    • p 推迟
    • mc 使用本地版本
    • tc 使用服务器版本
    • e 手动编辑
  3. 提交解决后的文件svn commit

四、配置文件详解

4.1 svnserve.conf(服务配置)

[general]
anon-access = none        # 匿名用户权限: none/read/write
auth-access = write       # 认证用户权限
password-db = passwd      # 用户口令文件(相对路径)
authz-db = authz          # 权限控制文件
realm = my_realm          # 认证域

4.2 passwd(用户文件)

[users]
admin = admin123
zhang = 123456

4.3 authz(路径权限)

[groups]
dev_team = zhang,li
admin_team = admin

[/]                      # 所有库根目录
@admin_team = rw
* = r

[repo1:/trunk]           # 特定库的路径
@dev_team = rw

五、SVN 启动模式(svnserve

模式 -r 参数指向 特点 URL 示例
单库 直接指向版本库目录 一个服务对应一个库 svn://host/
多库 指向版本库的父目录 一个服务对应多个库 svn://host/repo_name

权限段区别

  • 单库:[/] 表示该库根目录
  • 多库:[repo_name:/] 表示指定库根目录

六、TortoiseSVN 使用要点

  • 图标含义:绿色勾(一致)、红色感叹号(冲突)、蓝色加号(新增待提交)、灰色减号(删除待提交)
  • 常用操作:右键菜单 → SVN Checkout​、SVN Update​、SVN Commit​、TortoiseSVN → Branch/Tag​、Merge
  • 语言设置:安装后需重启;在 Settings​ → Language 切换中文
  • 分支/标签:通过 Branch/Tag​ 对话框完成 svn copy​,提交后需在目标目录执行 Update 才能看到

七、重要注意事项

  1. 原子提交:Commit 要么全部成功,要么全部失败,不会出现半成品。
  2. 提交前先 Update:避免基于过期版本修改导致冲突。
  3. 写清日志:每次提交应写明改动原因,便于追溯。
  4. 不要手动修改 .svn目录:会破坏版本控制元数据。
  5. 冲突处理:遇到冲突不要强行提交,按流程解决后再提交。
  6. Revert 不可逆svn revert 会丢弃所有未提交的本地改动,无法找回。
  7. 标签只读:标签创建后不应再提交修改,如需修复应基于标签新建分支。
  8. 分支合并后需提交svn merge​ 只影响工作副本,需执行 svn commit 使合并结果进入版本库。
  9. 路径大小写敏感:SVN 在类 Unix 系统下路径区分大小写,在 Windows 下通常不区分但建议保持一致。
  10. 备份版本库:定期使用 svnadmin dump 备份,防止数据丢失。

八、典型场景

场景 操作摘要
加入新项目 svn checkout​ → 编写代码 → svn add​ → svn commit
同步队友代码 svn update
放弃本地修改 svn revert <file>
恢复已提交的版本 svn merge -r 当前:目标​ → svn commit
创建开发分支 svn copy trunk/ branches/feature​ → svn commit
合并分支回主干 cd trunk​ → svn merge ../branches/feature​ → svn commit
发布版本打标签 svn copy trunk/ tags/v2.0​ → svn commit
查看某人提交历史 svn log --search username​ 或 svn log | grep username