欢迎光临
我们一直在努力

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

赞(0)
未经允许不得转载:171主机测评 » SVN 常用命令详解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址