虽然目前 Git 已是绝对主流,但一些历史项目、大型企业或特定团队仍在使用 SVN,了解在 macOS (iOS 开发的宿主系统) 上如何使用 SVN 命令依然很有必要。

这篇指南将涵盖从环境准备到日常开发的所有核心命令。
环境准备:安装 SVN
macOS 系统通常会预装一个基础的 SVN 命令行工具,你可以通过终端检查是否已安装。
检查是否已安装
打开终端(Terminal),输入以下命令:

svn --version
如果看到版本信息,说明已安装,如果提示 command not found,则需要手动安装。
安装或升级 SVN (推荐使用 Homebrew)
Homebrew 是 macOS 上最流行的包管理器,如果你没有安装,建议先安装它。
# 安装 Homebrew (官网命令) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
然后使用 Homebrew 安装或升级 SVN:

# 安装 SVN brew install subversion # 如果已安装,可以升级到最新版本 brew upgrade subversion
安装完成后,再次运行 svn --version 确认。
核心概念
在使用命令前,了解 SVN 的几个核心工作区域很重要:
- Repository (仓库 / SVN 服务器):存放所有项目代码和历史版本的服务器,地址通常是一个 URL,
svn://server_ip/project或https://svn.server.com/project。 - Working Copy (工作副本):从仓库 签出 到你本地的代码文件夹,这是你日常编码、修改的地方。
.svn文件夹:在每个工作副本的根目录及其子目录下都存在一个隐藏的.svn文件夹,它记录了本地文件与仓库的关联信息(如版本号、属性等),**千万不要手动删除或修改它!
常用 SVN 命令详解
以下命令是你日常开发中最频繁会用到的。
检出代码
这是你第一次获取项目代码的操作。
# 基本语法 svn checkout <SVN仓库URL> [本地文件夹名] # 示例:从仓库检出项目,并将本地文件夹命名为 "MyAwesomeApp" svn checkout svn://192.168.1.100/iOS/MyAwesomeApp MyAwesomeApp
svn co是svn checkout的简写,更常用。
查看状态
这是 最最常用 的命令,用于检查你本地的修改情况。
# 进入你的工作副本目录 cd /path/to/MyAwesomeApp # 查看状态 svn status
状态码的含义:
- 未版本控制的新文件(新创建的文件)。
M:修改过的文件。A:已添加到暂存区(即将提交)的文件。D:已标记为删除的文件。C:冲突,需要你手动解决。- 文件丢失或损坏(通常是
.svn文件夹出问题)。 I:被忽略的文件。- 文件类型被更改(文件变成了文件夹)。
添加文件/文件夹
当你创建新的文件或文件夹后,需要先将其加入 SVN 的管理。
# 添加单个文件 svn add path/to/your/new_file.swift # 添加一个新文件夹及其下所有内容 svn add path/to/your/new_folder/ # 添加所有未版本控制的文件和文件夹(慎用!) # 它会递归添加所有 '?' 状态的文件。 svn add *
提交修改
将你的修改从本地推送到 SVN 服务器。
# 提交单个文件 svn commit -m "修复了登录按钮的样式问题" path/to/your/modified_file.swift # 提交所有已暂存的修改 svn commit -m "feat: 添加了用户个人中心模块" # 提交所有修改的文件(包括未暂存的) # 这会自动将 'M' 状态的文件加入暂存区并提交,但不会处理 '?' 或 'D' 的文件。 svn commit -m "修复了多处bug" --keep-local
-m(message) 是必须的,用于清晰描述本次提交的内容,养成良好的习惯。svn ci是svn commit的简写。
更新代码
在提交之前或开始工作前,务必先更新,以确保你本地的代码是最新版本,避免与同事的修改冲突。
# 更新整个工作副本 svn update # 更新单个文件 svn update path/to/your/file.swift # svn up 是 svn update 的简写 svn up
查看差异
比较你的本地修改和仓库最新版本的差异。
# 查看所有已修改文件的差异 svn diff # 查看单个文件的差异 svn diff path/to/your/modified_file.swift # 使用外部工具查看差异(如 Meld, Diffmerge,需要先安装) svn diff --diff-cmd /usr/bin/meld
查看日志
查看项目的提交历史记录。
# 查看整个项目的提交日志 svn log # 查看某个文件的提交日志 svn log path/to/your/file.swift # 查看最近10条日志 svn log -l 10 # 显示每次修改的文件列表 svn log -v
解决冲突
当 svn update 或 svn commit 时出现冲突,文件内容会出现类似下面的标记:
<<<<<<< .mine // 你的代码 ======= // 合并进来的代码 >>>>>>> .r12345
你需要手动编辑文件,删除这些标记,并整合好代码,然后执行以下命令标记冲突已解决:
svn resolved path/to/your/conflicted_file.swift
删除文件
从工作副本和仓库中删除文件。
# 先在本地删除文件 rm path/to/your/file_to_delete.swift # 然后执行 svn delete 命令 svn delete path/to/your/file_to_delete.swift # 最后提交 svn commit -m "删除了不再使用的旧文件"
你也可以一步到位:
svn delete path/to/your/file_to_delete.swift && svn commit -m "删除了不再使用的旧文件"
查看和恢复历史版本
# 查看文件在某个版本时的内容(例如版本 123) svn cat -r 123 path/to/your/file.swift # 将文件恢复到某个版本(不会提交,只是本地覆盖) # 这相当于 "git checkout <commit> -- <file>" svn update -r 123 path/to/your/file.swift # 创建一个补丁文件,包含两个版本之间的差异 svn diff -r 100:120 > changes_from_100_to_120.patch
iOS 开发中的实际场景与技巧
场景1:处理 .gitignore 文件
SVN 没有 .gitignore 这样的标准文件,但它有类似的“忽略列表”。
使用 svn:ignore 属性(推荐)
这种方式只对当前目录有效,更灵活。
# 1. 进入你想设置忽略规则的目录,Pods 文件夹 cd Pods # 2. 设置该目录的忽略属性 # -R : 递归设置,对子目录也生效 # --targets : 从文件中读取规则 svn propset svn:ignore -R -F .gitignore .
使用 svn:global-ignores 属性
这种方式对整个工作副本有效。
# 在项目根目录执行 svn propset svn:global-ignores -F .gitignore .
注意:设置完忽略属性后,需要提交 才能生效。
svn commit -m "添加 SVN 忽略规则"
场景2:处理第三方库(如 CocoaPods)
对于通过 CocoaPods 管理的项目,Pods 目录和 Podfile.lock 文件通常都应该被忽略。
-
在项目根目录创建一个
.gitignore文件(即使你不用 Git,这个文件名也常用),内容如下:# CocoaPods /Pods/ /Podfile.lock -
按照上面的方法,将这个文件的内容设置为 SVN 的忽略规则。
-
提交你的修改。
场景3:SVN 与 Xcode 结合
你可以在 Xcode 的终端中直接执行这些命令,或者配置一个外部的 SVN 客户端(如 Versions, Cornerstone, SmartSVN)来配合使用,命令行提供了最大的灵活性和自动化能力。
总结与对比 (SVN vs Git)
| 特性 | SVN (Subversion) | Git |
|---|---|---|
| 仓库结构 | 中心化,一个中央服务器,多个本地副本。 | 分布式,每个本地副本都是一个完整的仓库。 |
| 提交 | svn commit:直接推送到中央服务器。 |
git commit:仅提交到本地仓库,git push 才推送到远程。 |
| 分支/标签 | 便宜,只是复制一个目录,没有特殊优化。 | 高效,指向某个提交的指针,非常轻量。 |
| 历史版本 | .svn 文件夹记录了元数据,但历史查看相对较慢。 |
每个提交都是一个快照,历史追踪非常快和强大。 |
| 工作流 | 简单直接,适合小型团队或对分布式概念不熟悉的开发者。 | 灵活强大(如 Git Flow, GitHub Flow),适合复杂协作。 |
| 命令行 | 相对简单,命令直观。 | 命令更丰富,概念稍复杂(如暂存区 staging area)。 |
对于新的 iOS 项目,强烈建议直接使用 Git,生态更完善,工具链更成熟,社区支持更好,但如果你的团队或项目历史原因必须使用 SVN,以上命令将足以支持你完成日常的开发工作。
