菜鸟科技网

svn import命令如何正确使用?

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

svn import命令如何正确使用?-图1
(图片来源网络,侵删)

svn import 是什么?

svn import 的核心作用是:将一个本地的、未纳入版本控制的目录树(比如一个新项目的源代码)一次性地“复制”到 SVN 服务器上,并为它创建一个 SVN 仓库历史。

关键点:

  • 一次性操作import 通常只执行一次,一旦你的项目已经在 SVN 仓库中,你就应该使用 svn checkoutsvn updatesvn commit 等命令来管理后续的更改。
  • 不创建工作副本:执行 import 之后,你的本地目录不会变成一个“工作副本”(Working Copy),它仍然是一个普通的目录,你对它的修改不会自动同步到仓库,你必须再次 checkout 才能获得一个可以进行版本控制的工作副本。
  • 创建初始历史import 会为导入的文件和目录在 SVN 仓库中创建初始的修订版本(通常是 revision 1)。

命令语法

svn import [PATH] [REPOS_URL] [OPTIONS]

参数说明:

  • [PATH]本地路径,指定你想要导入的本地文件或目录,如果你想导入当前目录下的所有内容,可以使用 。
  • [REPOS_URL]仓库 URL,指定你希望将内容导入到 SVN 服务器的哪个 URL 路径下,这个 URL 必须已经存在(你的项目根目录 URL),或者你的 SVN 服务器配置为允许在该父路径下自动创建新目录。

常用选项:

svn import命令如何正确使用?-图2
(图片来源网络,侵删)
  • -m 'LOG_MESSAGE'--message 'LOG_MESSAGE'非常重要! 指定本次导入的日志信息,每次提交(包括 import)都必须有日志信息。
  • -N--non-recursive:非递归导入,只导入指定目录本身,不导入其子目录。
  • --force:强制导入,如果目标 URL 已经存在内容,--force 会尝试覆盖它。请谨慎使用,因为这可能会导致数据丢失。
  • --no-auto-props:禁用自动属性设置,SVN 可以根据文件名自动设置 svn:keywordssvn: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

svn import命令如何正确使用?-图3
(图片来源网络,侵删)

步骤 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.mdMakefile

# 在 /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 = 把“工作间”(工作副本)里做好的活儿“交出去”。

常见问题与注意事项

  1. 目标 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'
    # (或者类似的目标非空错误)
  2. 忘记 -m 选项 如果你没有提供 -m 选项,SVN 会尝试打开一个编辑器(如 vinano)让你输入日志,如果你没有配置好编辑器,或者直接关闭了编辑器,提交可能会失败。

  3. 权限问题 确保你的 SVN 账号有权限向目标 URL 写入,如果没有,你会收到权限被拒绝的错误。

  4. 防火墙/代理 如果你的 SVN 服务器使用 https 协议,并且你处于一个需要代理的网络环境中,可能需要配置 SVN 的代理设置。

svn import 是 SVN 生命周期中用于项目初始化的关键命令,它的核心功能是将一个本地的、未版本控制的目录结构一次性地推送到 SVN 仓库,为其建立初始历史。import 之后,你还需要 checkout 一个工作副本才能开始日常的版本控制操作。

分享:
扫描分享到社交APP
上一篇
下一篇