本文档尚未完善,内容可能随时更改,可能无法准确描述任何已发布的 Apache™ Subversion® 软件版本。将此页面添加为书签或推荐给其他人可能不是明智之举。请访问 https://svnbooks.subversion.org.cn/ 获取此书的稳定版本。

版本标识符

正如我们在 名为“版本”的部分 中所述,Subversion 中的版本号非常直观——随着您对版本化数据进行更多更改,整数将不断增大。但是,很快您将不再能够准确记住每个版本中发生的事件。幸运的是,典型的 Subversion 工作流程通常不需要您对所执行的 Subversion 操作提供任意版本。对于确实需要版本标识符的操作,您通常会提供一个在提交电子邮件、其他 Subversion 操作的输出或其他赋予该特定数字意义的上下文中看到的版本号。

[Note] 注意

在 Subversion 社区中,使用带有 r 前缀(例如,r314)的版本号是一种既定的做法,并且受到许多与 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 正确地将版本日期转换为实际版本号的能力取决于版本日期戳保持顺序——版本越新,其日期戳越新。但日期戳存储在版本未版本化的可修改 svn:date 属性中(请参阅 名为“属性”的部分),因此版本日期戳有可能发生顺序错误。现在,Subversion 的大多数操作不受这种情况的影响——毕竟,版本号本身是每个版本的唯一标识符。但是,如果日期戳排序没有保持一致,您可能会发现尝试使用日期指定存储库中的版本范围并不总是能返回您预期的结果。将多个存储库的历史记录合并到一个存储库中(如 名为“将存储库数据迁移到其他地方”的部分 中所述)是这种情况最常见的原因。

TortoiseSVN 官方中文版 1.14.7 发布