SVN(Subversion)同Git、Gerrit一样是一个开源的版本控制系统,用于管理文件和目录的变更历史。
0. svn checkout
从 SVN(Subversion) 上拉取代码(checkout)
svn checkout <仓库地址> [本地目录名]
## 示例
svn checkout https://svn.example.com/project/trunk my_project
## 这会把 trunk 下的代码拉取到本地 my_project 目录中。
## svn checkout可以简写为svn co
1. svn status
svn status
用于查看 SVN 工作副本的状态,它会显示文件和目录的修改、未提交、冲突等信息。不同的状态由一个字符标识,每个状态代表文件或目录的不同情况。
1.1 常见状态码
状态码 | 含义 |
---|---|
? | 文件或目录 未受版本控制(未添加到 SVN) |
A | 已添加 到版本控制,但未提交 |
C | 冲突(Conflict),需要手动解决 |
D | 已删除,但尚未提交 |
I | 忽略(Ignored),被 .svnignore 规则忽略 |
M | 已修改(Modified),内容发生变更但未提交 |
R | 替换(Replaced),删除并重新添加了文件 |
X | 外部定义(eXternals),表示该目录是外部引用的 |
~ | 版本冲突,文件类型与 SVN 记录的不同 |
L | 锁定(Locked),本地文件被锁定,可能由于上次操作未完成 |
K | 已锁定(Kept Lock),手动保留的锁 |
T | 已切换(Switched),目录已切换到其他 SVN 路径 |
! | 丢失(Missing),文件被手动删除或丢失 |
E | 目录错误(Existed),目录状态异常 |
R+ | 即将替换,表示 svn rm 后执行 svn add |
S | 切换(Switched),路径已切换到其他分支 |
_ | 无状态(通常不会显示) |
1.2 仅显示已修改文件
svn status | grep '^M'
1.3 仅显示未跟踪的文件
svn status | grep '^?'
2. svn log
svn log
命令查看最近的提交日志
默认显示当前分支的提交日志,包括修订号(revision)、作者(author)、时间(date)、提交信息(message)。
仅查看最近 5 条提交记录:
svn log -l 5
3. svn update
3.1 svn update
svn update
用于同步本地代码与 SVN 服务器上的最新版本,确保你的工作副本保持最新。
svn update
作用:
- 获取服务器上的最新代码,并合并到本地工作副本。
- 不会覆盖本地未提交的修改(但可能会引发合并冲突)。
- 如果有更新,会显示修改的文件列表(U)和最新的修订版本号。
3.2 解决冲突
当 svn update
遇到文件冲突(C
状态),可以选择:
svn resolve --accept working file.txt
作用:接受工作区(本地)版本并解决冲突。
然后再次执行:
svn update
3.3 强制清理 SVN 锁定
如果 svn update
报错,如 “Working copy locked”,可以执行:
svn cleanup
svn update
作用:清除 SVN 工作副本的锁定状态,然后更新。
如果无效可强制更新
svn update --force
3.4 L
(Locked,锁定)状态的原因
- SVN 操作被中断:
- 例如,在
svn update
或svn commit
过程中,操作未正常完成,导致 SVN 目录锁定。
- 例如,在
- SVN 冲突未解决:
- 文件或目录有冲突,但未解决,SVN 自动锁定该目录。
- 手动锁定(svn lock):
- 某个用户手动锁定了该文件(但这种情况一般用
K
表示)。
- 某个用户手动锁定了该文件(但这种情况一般用
3.5 svn update
状态码解析
在 svn update
过程中,SVN 会在每个文件前显示一个字母,表示该文件的状态。
状态码 | 含义 |
---|---|
U | Updated(已更新),表示 SVN 从服务器拉取了新的内容 并更新了本地文件。 |
A | Added(已添加),表示此文件是新文件,并被从远程添加到本地。 |
D | Deleted(已删除),表示该文件已从 SVN 服务器删除,本地文件同步删除。 |
R | Replaced(已替换),文件被删除后重新添加。 |
G | Merged(合并成功),表示本地有修改,但 SVN 成功合并了远程改动**(没有冲突)**。 |
C | Conflict(冲突),本地修改与远程修改冲突,需要手动解决。 |
4. svn commit 与svn add
在 SVN(Subversion)中,提交(commit)代码时需要确保所有的修改和新增文件都正确添加到版本控制中。
4.1 提交修改的文件
如果只修改了已有的文件(未新增文件),直接提交:
svn commit -m "提交说明"
4.2 提交修改和新增文件
SVN 不会自动提交新增文件,必须手动 svn add
之后再提交:
svn add new_file.txt
svn commit -m "新增文件 new_file.txt"
4.3 如果新增多个文件,可以用 svn add .
添加当前目录下的所有新文件(?
状态的文件):
svn add .
svn commit -m "提交新增和修改的文件"
4.4 一次性提交所有修改和新增文件
svn add --force .
svn commit -m "提交所有修改和新增文件"
svn add --force .
:递归添加所有未受控文件和目录,但不会覆盖已忽略的文件(如 .svnignore
)。
4.5 仅提交指定的文件
svn commit -m "提交部分文件" file1.txt file2.txt
仅提交 file1.txt
和 file2.txt
,不提交其他变更。