这份文档是为了描述 Subversion 1.4 版本而编写的。如果您正在运行更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的书籍。

修订版本说明符

正如您在 名为“修订版本”的部分 中所见,Subversion 中的修订版本号非常直观——随着您对版本化数据的更改次数增加而不断增大的整数。尽管如此,您很快就会忘记在每个修订版本中到底发生了什么。幸运的是,典型的 Subversion 工作流程通常不需要您为所执行的 Subversion 操作提供任意修订版本。对于 需要 修订版本说明符的操作,您通常会提供在提交电子邮件、其他 Subversion 操作的输出中或其他一些上下文中看到的修订版本号,这些上下文将赋予该特定数字意义。

但是,有时您需要确定一个您没有记住或手边的修订版本号的时间点。因此,除了整数修订版本号之外,svn 允许作为输入使用一些额外的修订版本说明符形式——修订版本关键字 和修订版本日期。

注意

当用于指定修订版本范围时,Subversion 修订版本说明符的各种形式可以混合和匹配。例如,您可以使用 -r REV1:REV2,其中 REV1 是一个修订版本关键字,而 REV2 是一个修订版本号,或者其中 REV1 是一个日期,而 REV2 是一个修订版本关键字,等等。单个修订版本说明符是独立评估的,因此您可以在冒号的相反两侧放置任何您想要的内容。

修订版本关键字

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

HEAD

存储库中的最新(或“最年轻”)修订版本。

BASE

工作副本中项目的修订版本号。如果项目已在本地修改,则“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}
…

当您指定一个日期时,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}
…

警告

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