这是一个在 SVN 中非常基础且重要的命令,主要用于将未经版本控制的本地文件或目录首次导入到 SVN 仓库中。

svn import 是什么?
svn import 的核心作用是:将一个本地的、未纳入版本控制的目录树(比如一个新项目的源代码)一次性地“复制”到 SVN 服务器上,并为它创建一个 SVN 仓库历史。
关键点:
- 一次性操作:
import通常只执行一次,一旦你的项目已经在 SVN 仓库中,你就应该使用svn checkout、svn update、svn commit等命令来管理后续的更改。 - 不创建工作副本:执行
import之后,你的本地目录不会变成一个“工作副本”(Working Copy),它仍然是一个普通的目录,你对它的修改不会自动同步到仓库,你必须再次checkout才能获得一个可以进行版本控制的工作副本。 - 创建初始历史:
import会为导入的文件和目录在 SVN 仓库中创建初始的修订版本(通常是 revision 1)。
命令语法
svn import [PATH] [REPOS_URL] [OPTIONS]
参数说明:
[PATH]:本地路径,指定你想要导入的本地文件或目录,如果你想导入当前目录下的所有内容,可以使用 。[REPOS_URL]:仓库 URL,指定你希望将内容导入到 SVN 服务器的哪个 URL 路径下,这个 URL 必须已经存在(你的项目根目录 URL),或者你的 SVN 服务器配置为允许在该父路径下自动创建新目录。
常用选项:

-m 'LOG_MESSAGE'或--message 'LOG_MESSAGE':非常重要! 指定本次导入的日志信息,每次提交(包括import)都必须有日志信息。-N或--non-recursive:非递归导入,只导入指定目录本身,不导入其子目录。--force:强制导入,如果目标 URL 已经存在内容,--force会尝试覆盖它。请谨慎使用,因为这可能会导致数据丢失。--no-auto-props:禁用自动属性设置,SVN 可以根据文件名自动设置svn:keywords、svn:eol-style等属性,此选项可以禁用该功能。--config-dir DIR:指定一个临时的配置目录,而不是使用默认的~/.subversion。
使用场景与示例
导入一个全新的项目
假设你有一个新项目,其本地目录结构如下:
/my-new-project
|-- src/
| |-- main.c
| `-- utils.h
|-- README.md
`-- Makefile
现在你想将这个整个项目导入到 SVN 服务器,仓库地址为 http://svn.example.com/repos/my_first_app。
步骤 1:在 SVN 服务器上创建项目根目录(如果需要)
管理员会在 SVN 服务器上创建好 http://svn.example.com/repos/ 这个结构,你需要确保 my_first_app 这个目录存在,或者你的 SVN 服务器允许你直接导入到 http://svn.example.com/repos/my_first_app。

步骤 2:执行 import 命令
打开终端,进入到 /my-new-project 目录,然后执行:
# 进入项目根目录 cd /my-new-project # 执行导入命令 svn import . http://svn.example.com/repos/my_first_app -m "Initial import of my_first_app project"
命令分解:
- 表示当前目录,即导入
/my-new-project下的所有内容。 http://svn.example.com/repos/my_first_app:目标仓库 URL。-m "Initial import...":本次导入的日志信息,清晰地说明了这次操作的内容。
执行成功后:
- 你的项目文件现在存在于 SVN 服务器的
http://svn.example.com/repos/my_first_app路径下。 - 你的本地
/my-new-project目录依然是一个普通目录,没有任何 SVN 元数据(如.svn文件)。
步骤 3:创建一个工作副本(可选但推荐)
为了后续能够方便地更新和提交代码,你需要从仓库中 checkout 一个工作副本:
# 在任意位置创建一个新目录作为工作区 mkdir ~/workspace cd ~/workspace # 从仓库检出代码 svn checkout http://svn.example.com/repos/my_first_app # ~/workspace/my_first_app 就是一个完整的工作副本了 cd my_first_app # 你可以在这里修改文件,然后使用 svn add, svn commit 等命令
只导入特定目录
假设你只想导入 src 目录,而不导入 README.md 和 Makefile。
# 在 /my-new-project 目录下执行 svn import src http://svn.example.com/repos/my_first_app/trunk/src -m "Import source code directory only"
这会将本地的 src 目录导入到仓库的 trunk/src 路径下。
svn import vs. svn commit
这是一个非常常见的混淆点,下表可以帮助你理解它们的区别:
| 特性 | svn import |
svn commit |
|---|---|---|
| 目的 | 首次放入仓库 | 将已存在于工作副本中的更改提交到仓库 |
| 操作对象 | 任何本地目录(非工作副本) | 工作副本(包含 .svn 目录的目录) |
| 本地变化 | 无,本地目录不变,不会变成工作副本。 | 无,本地文件会更新到最新版本,并标记为“已提交”。 |
| 使用频率 | 一次(项目初始化时) | 多次(日常开发中) |
| 典型工作流 | import -> checkout -> (修改) -> add/delete -> commit |
简单记忆:
import= 把“外面”的东西“搬进”仓库。commit= 把“工作间”(工作副本)里做好的活儿“交出去”。
常见问题与注意事项
-
目标 URL 已存在 如果你尝试导入到一个已经存在的 URL,SVN 默认会报错,告诉你目标已非空,除非你明确知道后果,否则不要使用
--force选项。# 错误示例 svn import . http://svn.example.com/repos/existing_project -m "My import" # 输出: svn: E155010: 'http://svn.example.com/repos/existing_project' is not the same repository as 'http://svn.example.com/repos/existing_project' # (或者类似的目标非空错误)
-
忘记
-m选项 如果你没有提供-m选项,SVN 会尝试打开一个编辑器(如vi或nano)让你输入日志,如果你没有配置好编辑器,或者直接关闭了编辑器,提交可能会失败。 -
权限问题 确保你的 SVN 账号有权限向目标 URL 写入,如果没有,你会收到权限被拒绝的错误。
-
防火墙/代理 如果你的 SVN 服务器使用
https协议,并且你处于一个需要代理的网络环境中,可能需要配置 SVN 的代理设置。
svn import 是 SVN 生命周期中用于项目初始化的关键命令,它的核心功能是将一个本地的、未版本控制的目录结构一次性地推送到 SVN 仓库,为其建立初始历史。import 之后,你还需要 checkout 一个工作副本才能开始日常的版本控制操作。
