Apache Subversion: 快速入门

安装 SVN 客户端

安装 svn 客户端以开始协作使用 Subversion 作为版本控制系统的项目。

要安装客户端程序,您可以从源代码发行版中自行构建,也可以下载二进制包。您可以在 官方二进制包页面 上找到获取预构建 Subversion 客户端的网站列表。如果您想自己编译软件,请在 源代码 页面获取源代码。

安装客户端后,您应该能够通过发出 svn 命令来测试它。您应该看到以下输出

$ svn
Type 'svn help' for usage.

现在您可以开始使用命令行客户端与远程仓库进行交互。

如果您不熟悉 Subversion,图形客户端可能更适合您。我们不维护此类客户端的列表;相反,我们建议您在网络上搜索 Subversion GUI 客户端。

术语

什么是仓库?

仓库是一个版本控制数据库,通常驻留在服务器上,并且通常通过 Apache HTTP 服务器(通过 mod_dav_svn 模块)或 svnserve 服务器公开。仓库充当单一的事实来源,并且作为中央存储,它包含版本化数据的完整更改历史记录,以修订的形式。

仓库 URL 示例

  • Apache HTTP 服务器:https://svn.example.com/repos/MyRepo/MyProject/trunk
  • svnserve:svn://svn.example.com/repos/MyRepo/MyProject/branches/MyBranch
  • 直接访问(Unix 风格):file:///var/svn/repos/MyRepo/MyProject/tags/1.1.0
  • 直接访问(Windows 风格):file:///C:/Repositories/MyRepo/trunk/MyProject

什么是工作副本?

工作副本是您用于与中央 Subversion 仓库交互的本地私有工作区。您使用工作副本修改项目的內容,并获取其他人提交的更改。

工作副本包含项目的數據,看起来并像您本地文件系统上的普通目录一样,但有一个主要区别 - 工作副本跟踪文件和目录中的状态和更改。您可以将工作副本视为具有版本控制功能的普通目录。工作副本在其根目录中有一个名为 .svn 的管理目录。管理目录包含 Subversion 管理版本控制功能所需的元数据。

您可以从同一个仓库或项目中创建任意数量的工作副本,并且可以包含任意组合的本地修改。

基本任务

将数据导入仓库

如果您想将现有的非版本化数据导入 SVN 仓库,您应该运行 svn import 命令。以下是一个示例

$ svn import https://svn.example.com/repos/MyRepo/MyProject/trunk -m "Initial project import"

检出工作副本

要开始修改项目的數據,您必须创建版本化项目的本地副本。您可以使用命令行 svn 客户端或您喜欢的任何基于 GUI 的客户端。项目的本地副本称为工作副本,您可以通过发出 svn checkout 命令来创建它。以下是一个示例

$ svn checkout https://svn.example.com/repos/MyRepo/MyProject/trunk MyWorkingCopy

这样,您将获得名为 MyProject 的项目的树干的工作副本,该项目位于 MyRepo 存储库中。工作副本将位于您计算机上的 MyWorkingCopy 目录中。请注意,您可以检出分支或标签(假设它们已存在于存储库中),而不是检出树干。

您也可以获取整个 MyRepo 存储库的工作副本。但您应该避免这样做。一般来说,您不需要为您的工作拥有整个存储库的工作副本,因为您的工作副本可以立即切换到另一个开发分支。此外,Subversion 存储库可以包含许多不相关的项目,最好为每个项目设置一个专用工作副本,而不是为所有项目设置一个工作副本。

更新工作副本

您不是唯一一个在项目上工作的人,对吧?这意味着您的同事也在对项目数据进行修改。为了保持最新状态并获取其他人提交的修改,您应该在工作副本中运行 svn update 命令。这样,您的工作副本将与存储库同步并下载同事所做的更改。

在将本地修改提交到存储库之前更新您的工作副本是一个好习惯。

在本地工作副本中进行更改

大多数情况下,您将通过修改工作副本的内容来对项目数据进行修改。一旦您对修改感到满意并彻底审查了它们,您就可以将它们提交到中央存储库。

修改现有文件

使用您喜欢的文本处理器、图形编辑器、音频编辑软件、IDE 等,像往常一样修改文件。一旦您将更改保存到磁盘,Subversion 将自动识别它们。

将更改提交到存储库

为了发布您在工作副本中所做的更改,您应该运行 svn commit 命令。

在提交更改之前,请查看您的更改!使用 svn statussvn diff 命令来查看更改。

以下是一个提交命令的示例

$ svn commit -m "My Descriptive Log Message"

请注意 -m (--message) 选项。您应该始终包含一个描述性的提交日志消息。它应该帮助包括您自己在内的其他人理解您进行此提交的原因。在日志消息中包含更改摘要也是一个好主意。

执行文件和目录操作

您可以在工作副本中对项目的任何数据执行任何操作,但涉及复制、移动、重命名和删除的操作必须使用相应的 svn 命令执行。

Subversion 不使用启发式跟踪来跟踪工作副本中的树更改。Subversion 需要显式跟踪树更改。如果您使用常规文件系统命令执行树更改(例如移动或复制),Subversion 将不会知道此操作。为了跟踪树更改,Subversion 应该知道它们。

添加新文件和目录

将新文件或目录放入工作副本,Subversion 会将它们视为“未版本化”。除非您运行 svn add 命令,否则它不会自动开始跟踪新文件。

$ svn add foo.cs

移动和重命名文件和目录

使用 svn movesvn rename 命令移动和重命名文件和目录。

$ svn move foo.cs bar.cs

命令 svn renamesvn move 的别名。

复制文件和目录

使用 svn copy 命令复制文件和目录。

$ svn copy foo.cs bar.cs

删除文件和目录

使用 svn delete svn delete 命令删除文件和目录。

$ svn delete foo.cs

还原或丢弃本地更改

使用 svn revert 命令丢弃您未提交的本地更改。

$ svn revert foo.cs

丢弃的未提交更改将永远丢失。您将无法恢复已还原的更改。谨慎使用 svn revert

分支和标记

您应该使用 svn copy 命令来创建分支和标签。这与用于复制工作副本和存储库中的项目的相同命令,当您希望它们在历史上相关时。

命令 svn copy 用于创建分支,因为分支从技术上讲是您复制的源代码的副本。但是,它与您在本地文件系统中复制文件时熟悉的普通副本不同。Subversion 存储库中的分支被称为 "廉价副本",类似于符号链接。因此,创建新分支只需最少的时间即可完成,并且在 Subversion 存储库中几乎不占用空间。您可以创建分支并将其用于您想要的任何更改,无论更改的大小和范围如何。

使用直接 URL 到 URL 复制创建分支

在 Subversion 中创建分支很简单。最简单的方法是,创建新分支需要您针对远程存储库的 URL 运行命令。例如,让我们从主干分支创建一个新分支

$ svn copy https://example.com/MyRepo/trunk https://example.com/MyRepo/branches/MyNewBranch -m "Creating a new branch"

设置本地存储库

您可以在计算机上创建 Subversion 存储库,并使用 file:// 方案在本地与它交互。这种方法可以帮助您在本地使用 Subversion 来跟踪个人文件和单人项目。

以下过程为现有项目创建了一个最小环境。它将包含项目的目录转换为新创建的本地 Subversion 存储库的工作副本。因此,您可以修改工作副本中的文件并在本地存储库中跟踪更改。

在 Unix 上

  1. 创建一个父目录 .svnrepos,您将在其中放置您的 SVN 存储库
    $ mkdir -p $HOME/.svnrepos/
  2. .svnrepos 下创建一个新的存储库 MyRepo
    $ svnadmin create ~/.svnrepos/MyRepo
  3. 在新的存储库中创建一个推荐的项目布局
    $ svn mkdir -m "Create directory structure." \
      file://$HOME/.svnrepos/MyRepo/trunk \
      file://$HOME/.svnrepos/MyRepo/branches \
      file://$HOME/.svnrepos/MyRepo/tags
  4. 更改目录到 ./MyProject,您的未版本化项目位于此处
    $ cd $HOME/MyProject
  5. 将当前目录转换为存储库中 trunk/ 的工作副本
    $ svn checkout file://$HOME/.svnrepos/MyRepo/trunk ./
  6. 安排您的项目文件添加到存储库
    $ svn add --force ./
  7. 提交项目文件
    $ svn commit -m "Initial import."
  8. 更新您的工作副本
    $ svn update

在 Windows 上

  1. 创建一个父目录 C:\Repositories,您将在其中放置您的 SVN 存储库
    mkdir C:\Repositories
  2. C:\Repositories 下创建一个新的存储库 MyRepo
    svnadmin create C:\Repositories\MyRepo
  3. 在新的存储库中创建一个推荐的项目布局
    svn mkdir -m "Create directory structure." ^
      file:///C:/Repositories/MyRepo/trunk ^
      file:///C:/Repositories/MyRepo/branches ^
      file:///C:/Repositories/MyRepo/tags 
  4. 更改目录到 C:\MyProject,您的未版本化项目位于此处
    cd C:\MyProject
  5. 将当前目录转换为存储库中 trunk/ 的工作副本
    svn checkout file:///C:/Repositories/MyRepo/trunk .
  6. 安排您的项目文件添加到存储库
    svn add --force ./
  7. 提交项目文件
    svn commit -m "Initial import."
  8. 更新您的工作副本
    svn update

另请参阅 Subversion 手册中的快速入门说明

获取更多帮助

如果您是 Apache Subversion (SVN) 的新手,请阅读使用 Subversion 进行版本控制手册 (SVNBook)。SVNBook 是 SVN 的圣经,是 Subversion 用户和管理员的必读手册。您可以在 https://svnbook.subversion.org.cn/en/1.8/ 找到 SVNBook 1.8