本文档旨在描述 Apache™ Subversion® 的 1.7.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 update -r {2006-02-17}
$ svn update -r {15:30}
$ svn update -r {15:30:00.200000}
$ svn update -r {"2006-02-17 15:30"}
$ svn update -r {"2006-02-17 15:30 +0230"}
$ svn update -r {2006-02-17T15:30}
$ svn update -r {2006-02-17T15:30Z}
$ svn update -r {2006-02-17T15:30-04:00}
$ svn update -r {20060217T1530}
$ svn update -r {20060217T1530Z}
$ svn update -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 正确地将修订日期转换为实际修订号的能力取决于修订日期戳维护顺序——修订越新,其时间戳越新。如果未维护此顺序,您可能会发现尝试使用日期指定存储库中的修订范围并不总是返回您可能期望的数据。