本文档是为描述 Subversion 1.6.x 系列而编写的。如果您运行的是不同版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅与您的 Subversion 版本相匹配的版本文档。

版本标识符

正如我们在 名为“版本”的部分 中所述,Subversion 中的版本号非常简单 - 随着您对版本化数据的更多更改,整数会越来越大。但是,很快您就无法记住每个版本中到底发生了什么。幸运的是,典型的 Subversion 工作流程通常不需要您为执行的 Subversion 操作提供任意版本。对于确实需要版本标识符的操作,您通常会提供在提交邮件、其他 Subversion 操作的输出或其他提供该特定数字含义的上下文中看到的版本号。

[Note] 注意

使用 r 前缀(例如 r314)来引用版本号是 Subversion 社区的既定做法,并且得到了许多与 Subversion 相关的工具的支持和鼓励。在命令行上指定裸版本号的大多数地方,您也可以使用 rNNN 语法。

但有时,您需要确定一个您还没有记住或方便的版本号的时间点。因此,除了整数版本号之外,svn 还允许作为输入一些额外的版本标识符形式:版本关键字 和版本日期。

[Note] 注意

当用于指定版本范围时,Subversion 版本标识符的各种形式可以混合使用。例如,您可以使用 -r REV1:REV2,其中 REV1 是版本关键字,而 REV2 是版本号,或者 REV1 是日期,而 REV2 是版本关键字,等等。各个版本标识符是独立评估的,因此您可以在冒号两侧放置任何想要的东西。

版本关键字

Subversion 客户端理解许多版本关键字。这些关键字可以代替 --revision (-r) 选项的整数参数使用,并且由 Subversion 解析为特定的版本号。

HEAD

存储库中的最新(或 最年轻)版本。

BASE

工作副本中项目的版本号。如果该项目已被本地修改,则它指的是该项目在没有这些本地修改的情况下的外观。

COMMITTED

项目更改的最后一个版本之前或等于 BASE 的最新版本。

PREV

项目更改的最后一个版本之前的版本。从技术上讲,这归结为 COMMITTED-1。

正如从它们的描述中可以推断出的那样,PREVBASECOMMITTED 版本关键字仅在引用工作副本路径时使用 - 它们不适用于存储库 URL。另一方面,HEAD 可以与这两种路径类型一起使用。

以下是一些版本关键字实际操作的示例

$ svn diff -r PREV:COMMITTED foo.c
# shows the last change committed to foo.c

$ svn log -r HEAD
# shows log message for the latest repository commit

$ svn diff -r HEAD
# compares your working copy (with all of its local changes) to the
# latest version of that tree in the repository

$ svn diff -r BASE:HEAD foo.c
# compares the unmodified version of foo.c with the latest version of
# foo.c in the repository

$ svn log -r BASE:HEAD
# shows all commit logs for the current versioned directory since you
# last updated

$ svn update -r PREV foo.c
# rewinds the last change on foo.c, decreasing foo.c's working revision

$ svn diff -r BASE:14 foo.c
# compares the unmodified version of foo.c with the way foo.c looked
# in revision 14

版本日期

版本号没有透露版本控制系统之外的世界的信息,但有时您需要将现实世界中的某个时间点与版本历史中的某个时间点相关联。为了方便这一点,--revision (-r) 选项还可以接受包含在花括号 ({}) 中的日期规范作为输入。Subversion 接受标准的 ISO-8601 日期和时间格式,以及其他一些格式。以下是一些示例。

$ svn checkout -r {2006-02-17}
$ svn checkout -r {15:30}
$ svn checkout -r {15:30:00.200000}
$ svn checkout -r {"2006-02-17 15:30"}
$ svn checkout -r {"2006-02-17 15:30 +0230"}
$ svn checkout -r {2006-02-17T15:30}
$ svn checkout -r {2006-02-17T15:30Z}
$ svn checkout -r {2006-02-17T15:30-04:00}
$ svn checkout -r {20060217T1530}
$ svn checkout -r {20060217T1530Z}
$ svn checkout -r {20060217T1530-0500}
…
[Note] 注意

请记住,大多数 shell 至少需要您引用或以其他方式转义作为版本日期规范的一部分包含的任何空格。某些 shell 可能会对未转义的花括号的使用也提出异议。请参阅您的 shell 文档以了解特定于您的环境的要求。

当您指定日期时,Subversion 会将该日期解析为该日期截至时的存储库的最新版本,然后继续针对该解析的版本号进行操作。

$ svn log -r {2006-11-28}
------------------------------------------------------------------------
r12 | ira | 2006-11-27 12:31:51 -0600 (Mon, 27 Nov 2006) | 6 lines
…

您也可以使用日期范围。Subversion 会找到两个日期之间的所有版本,包括这两个日期。

$ svn log -r {2006-11-20}:{2006-11-29}
…
[Warning] 警告

由于版本的 时间戳 存储为版本的非版本化、可修改的属性(请参阅 名为“属性”的部分),版本时间戳可以更改以完全伪造真实时间顺序,甚至完全删除。Subversion 正确地将版本日期转换为实际版本号的能力取决于版本日期戳保持顺序 - 版本越年轻,其时间戳就越年轻。如果未保持此顺序,您可能会发现尝试使用日期来指定存储库中的版本范围并不总是能返回您可能预期的结果。