SVN(Subversion)是集中式版本控制系统,在芯片设计/验证团队中广泛使用。以下按使用场景分类详解常用命令。
一、基础概念速览
| 概念 | 说明 |
|---|---|
| Repository(仓库) | 服务器端集中存储所有版本历史 |
| Working Copy(工作副本) | 本地检出的工作目录 |
| Revision(版本号) | 全局递增的整数版本号(r1, r2, ...) |
| HEAD | 仓库中最新版本 |
| BASE | 工作副本对应的版本 |
| trunk/branches/tags | 主干/分支/标签(约定目录结构) |
二、检出与初始化
1. checkout(检出)------ 首次获取代码
# 检出整个仓库
svn checkout <url>
svn co <url> # co 是简写
# 检出到指定目录
svn co <url> my_project
# 检出指定版本
svn co -r 100 <url>
# 只检出某个子目录(SVN 的优势)
svn co https://repo/project/rtl/
2. import(导入)------ 把本地目录首次上传到仓库
svn import ./local_dir <url> -m "initial import"
三、查看状态与信息
1. status(查看本地状态)★ 最常用
svn status # 查看工作副本改动
svn st # 简写
svn status -u # 同时显示服务器更新(带 * 标记)
svn status -q # 只显示有改动的文件
状态码含义:
| 符号 | 含义 |
|---|---|
| M | Modified,已修改 |
| A | Added,已添加(待提交) |
| D | Deleted,已删除(待提交) |
| ? | 未纳入版本控制 |
| ! | 文件丢失(被非 svn 方式删除) |
| C | Conflict,冲突 |
| * | 服务器有更新(配合 -u) |
| G | merGed,合并成功 |
2. info(查看版本信息)
svn info # 显示 URL、版本号、作者等
svn info <file>
3. log(查看提交历史)★
svn log # 查看历史记录
svn log -l 10 # 只看最近 10 条
svn log -v # 显示每次改动的文件列表
svn log -r 100:200 # 查看版本 100~200
svn log <file> # 查看某文件的历史
svn log -r 100 -v # 查看版本100的详细改动
4. diff(查看差异)★
svn diff # 本地改动 vs BASE
svn diff <file> # 某文件的改动
svn diff -r 100:200 # 版本100与200的差异
svn diff -r 100 <file> # 工作副本与版本100的差异
svn diff -r PREV:HEAD <file> # 上一版与最新版差异
四、更新与提交(日常核心)
1. update(更新)★ 最常用
svn update # 更新到最新版本(HEAD)
svn up # 简写
svn up -r 100 # 更新到指定版本
svn up <file> # 只更新某文件
好习惯 :每天开始工作前先
svn up,提交前也先svn up,减少冲突。
2. commit(提交)★ 最常用
svn commit -m "提交说明" # 提交所有改动
svn ci -m "fix bug" # ci 是简写
svn commit <file> -m "说明" # 只提交某文件
svn commit dir1 file2 -m "说明" # 提交多个指定项
重要 :
-m提交说明是强制要求(团队规范),写清楚改了什么。
五、增删改与移动
1. add(添加新文件到版本控制)
svn add <file> # 添加单个文件
svn add <dir> # 添加目录(含内容)
svn add --force . # 添加当前目录所有未跟踪文件
svn add *.v # 添加所有 .v 文件
新建文件后必须
svn add,再commit才会进仓库。
2. delete(删除)
svn delete <file> # 删除文件(标记删除)
svn del <file> # 简写
svn rm <file> # 同义
svn delete <url> -m "说明" # 直接删除仓库中的文件
3. copy(复制,常用于建分支/标签)
svn copy <src> <dst> -m "说明"
svn cp trunk branches/dev -m "create dev branch"
4. move / rename(移动或重命名)
svn move <src> <dst> # 移动/重命名(保留历史)
svn mv old.v new.v # 重命名文件
注意:删除、移动、重命名都要用 svn 命令,不要直接用系统命令(rm/mv),否则丢失版本追踪。
六、撤销与恢复
1. revert(撤销本地改动)★ 常用
svn revert <file> # 撤销单个文件的本地修改
svn revert -R . # 递归撤销当前目录所有改动
svn revert --depth=infinity . # 同上
⚠️ revert 会丢弃所有未提交改动,恢复到 BASE 版本,不可逆,谨慎使用。
2. 恢复到历史版本
# 方法1:反向合并撤销某次提交
svn merge -r 200:199 . # 撤销版本200的改动
svn commit -m "revert r200"
# 方法2:把文件恢复到旧版本
svn up -r 100 <file> # 临时回退某文件
svn merge -r HEAD:100 <file> # 把文件内容恢复到版本100
3. cleanup(清理锁定/中断状态)★ 实用
svn cleanup # 清理工作副本(解决"locked"错误)
当 SVN 操作中断导致工作副本被锁定(提示 "working copy locked")时用此命令修复。
七、冲突处理
当 update/merge 出现冲突(状态 C):
svn update
# 出现冲突时会生成几个文件:
# file.mine 你的版本
# file.rOLD 旧版本
# file.rNEW 服务器新版本
# file 含冲突标记的文件
解决步骤:
# 1. 手动编辑 file,解决冲突标记 (<<<<<<< ======= >>>>>>>)
# 2. 标记冲突已解决
svn resolve --accept working <file>
# 或
svn resolved <file>
# 3. 提交
svn commit -m "resolve conflict"
冲突时的交互选项(update 时会提示):
| 选项 | 含义 |
|---|---|
| (p) postpone | 推迟,稍后手动解决 |
| (mf) mine-full | 全部用我的版本 |
| (tf) theirs-full | 全部用服务器版本 |
| (e) edit | 手动编辑 |
| (s) show all | 显示所有选项 |
八、分支与标签(trunk/branches/tags)
1. 标准目录结构
repo/
├── trunk/ # 主干(主开发线)
├── branches/ # 分支(特性开发、bug 修复)
└── tags/ # 标签(发布版本快照)
2. 创建分支
svn copy https://repo/trunk \
https://repo/branches/feature_x \
-m "create feature_x branch"
3. 创建标签(如流片版本)
svn copy https://repo/trunk \
https://repo/tags/v1.0_tapeout \
-m "tag v1.0 tapeout"
4. 分支合并回主干
# 切换到 trunk 工作副本
svn merge https://repo/branches/feature_x
svn commit -m "merge feature_x to trunk"
# 合并指定版本范围
svn merge -r 100:150 https://repo/branches/feature_x
5. switch(切换工作副本到其他分支)
svn switch https://repo/branches/feature_x
svn sw https://repo/trunk # 切回主干
九、锁定机制(处理二进制文件)★ 芯片团队常用
二进制文件(库、版图、文档)无法合并,需独占锁定:
svn lock <file> -m "editing" # 锁定文件
svn unlock <file> # 解锁
svn unlock --force <file> # 强制解锁(解他人的锁)
svn status # 带 K 表示自己持有锁
svn info <file> # 查看锁信息
| 锁状态码 | 含义 |
|---|---|
| K | 我持有锁 |
| O | 他人持有锁 |
| T | 锁被偷(被别人 break) |
| B | 锁失效(broken) |
十、其他实用命令
1. list(列出仓库内容,不下载)
svn list <url> # 列出目录内容
svn ls <url> # 简写
svn ls -v <url> # 详细信息
svn ls -R <url> # 递归列出
2. cat(查看仓库中文件内容)
svn cat <url> # 查看仓库文件内容
svn cat -r 100 <file> # 查看某版本的文件内容
3. blame / praise(逐行查看作者)★ 调试找责任人
svn blame <file> # 显示每行由谁、哪个版本修改
svn praise <file> # 同义
svn annotate <file> # 同义
4. propset / propget(属性操作)
# 设置忽略文件(类似 .gitignore)
svn propset svn:ignore "*.log" .
svn propset svn:ignore -F ignore_list . # 从文件读取忽略列表
svn propget svn:ignore . # 查看忽略属性
svn propedit svn:ignore . # 编辑忽略属性
# 设置可执行属性
svn propset svn:executable ON script.sh
5. export(导出无版本信息的纯净副本)
svn export <url> <dir> # 导出干净副本(不含 .svn)
svn export -r 100 <url> <dir> # 导出指定版本
用于发布/打包,不含
.svn隐藏目录。
十一、常用命令速查表
| 命令 | 简写 | 功能 |
|---|---|---|
| svn checkout | co | 检出 |
| svn update | up | 更新 |
| svn commit | ci | 提交 |
| svn status | st | 查看状态 |
| svn add | --- | 添加 |
| svn delete | del/rm | 删除 |
| svn revert | --- | 撤销改动 |
| svn diff | di | 查看差异 |
| svn log | --- | 查看历史 |
| svn info | --- | 版本信息 |
| svn list | ls | 列出内容 |
| svn copy | cp | 复制/建分支 |
| svn move | mv | 移动/重命名 |
| svn merge | --- | 合并 |
| svn switch | sw | 切换分支 |
| svn cleanup | --- | 清理锁定 |
| svn lock/unlock | --- | 加锁/解锁 |
| svn blame | --- | 逐行作者 |
| svn resolve | --- | 解决冲突 |
十二、典型工作流程
日常开发流程
# 1. 早上更新到最新
svn up
# 2. 修改代码、添加新文件
svn add new_file.v
# 3. 查看自己的改动
svn st
svn diff
# 4. 提交前再次更新(避免冲突)
svn up
# 5. 解决可能的冲突后提交
svn ci -m "add feature xxx"
二进制文件编辑流程(芯片团队)
svn up
svn lock design.gds -m "editing layout" # 先锁定
# ... 编辑文件 ...
svn ci design.gds -m "update layout" # 提交自动解锁
十三、实用技巧与注意事项
| 技巧 | 说明 |
|---|---|
| 提交前先 update | 减少冲突,养成习惯 |
| 提交信息要清晰 | 团队协作和追溯的关键 |
| 小步提交 | 每个逻辑改动单独提交,便于回退 |
| 不提交临时文件 | 用 svn:ignore 忽略 log/编译产物 |
| 二进制文件加锁 | 防止多人同时改无法合并 |
| 遇到锁定用 cleanup | "locked" 错误的万能解法 |
| 不要手动删 .svn | 会破坏工作副本 |
| 删除/移动用 svn 命令 | 不要用系统 rm/mv |
| 流片打 tag | 重要里程碑用 tag 固化版本 |
十四、常见问题排查
| 问题 | 解决方法 |
|---|---|
| working copy locked | svn cleanup |
| 文件状态 !(丢失) | svn revert <file> 恢复 |
| 冲突 C | 手动解决后 svn resolve --accept working |
| 想忽略某些文件 | svn propset svn:ignore |
| 误提交想撤销 | svn merge -r N:N-1 . 反向合并 |
| 不小心 revert 了 | 无法恢复(未提交改动已丢失,谨慎) |
总结
日常最高频 5 条命令:
svn up # 更新 svn st # 看状态 svn diff # 看改动 svn ci -m "..." # 提交 svn add # 加新文件芯片团队特色 :善用
svn lock(二进制文件锁定)、svn co <子目录>(部分检出)、svn copy ... tags/(流片版本固化),这正是 SVN 在 IC 行业受青睐的核心能力。