SVN 常用命令详解

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 行业受青睐的核心能力。