This text is a work in progress—highly subject to change—and may not accurately describe any released version of the Apache™ Subversion® software. Bookmarking or otherwise referring others to this page is probably not such a smart idea. Please visit http://www.svnbook.com/ for stable versions of this book.

版本号指示器

我们已经在 “版本号”一节 说过, Subversion 的版本号非常直观—随着提交的不断增多, 表示版本号的整数 也不断增大, 但是用不了多久, 用户就再也记不清每个版本号包含了哪些修改. 幸运的是, Subversion 的典型工作流程不太经常要求用户提供版本号, 对于 那些确实需要版本号的操作而言, 用户可以从提交日志中看到所需的版本号, 或者 使用在特定语境下可以表示特定版本号的关键字.

[注意] 注意

在引用版本号时, 在数字的左边增加一个前缀 r (例如 r314) 是 Subversion 社区约定俗成的做法, 很多 Subversion 的相关工具都鼓励 这种写法. 在需要提供裸版本号的大多数场合中, 你也可以使用 rNNN 形式的语法.

但是在少数情况下, 用户必须及时精确地描述出版本号, 可是手上却没有合适的参数. 所以除了用整数指定版本号外, svn 还支持另外两种指定版本 号的形式: 版本号关键字 (revision keywords) 和版本号日期.

[注意] 注意

在指定版本号范围时, 可以混合使用不同形式的版本号指示器, 例如你可 以把 -rREV1:REV2 中的 REV1 写成 版本号关键字, 把 REV2 写成整数, 或者把 REV1 写成日期, 把 REV2 写成版本号关键字, 如此等等. 每个版本号指示器被单独求值, 所以你可以把任意形式的版本号指示器放在冒号的两边.

版本号关键字

Subversion 支持理解的版本号关键字有很多个, 可以用这些关键字替换 选项 --revision (-r) 后面的整数, 这些关键字会被 Subversion 解释成特定的版本号:

HEAD

仓库中最近的 (或最年轻的) 版本号.

BASE

工作副本中的某一项目的版本号, 如果该项在本地被修改了, 则该 版本号引用的是修改前的项目.

COMMITTED

等于或早于 BASE 并且离它最近的一个版本号, 在该版本号中项目被修改了.

PREV

项目最后一次被修改时的版本号的前一个版本号, 从技术上讲它 就是 COMMITTED-1.

从它们的描述可以看出, PREV, BASECOMMITTED 只能引用工作 副本中的路径, 而 HEAD 既可以引用工作副本中的路径, 也可以引用仓库的 URL.

下面是一些版本号关键字的使用示例:

$ 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}
…
[注意] 注意

如果版本号日期参数中含有空格, 那么大多数 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}
…
[警告] 警告

Subversion 能够根据版本号日期得到版本号是因为版本号的时间戳被维护 成一个串行化的序列—版本号越年轻, 时间戳也就越年轻. 但是时间戳 是存放在版本号的 svn:date 属性内 (见 “属性”一节), 而该属性是可修改的, 且未被纳 入版本管理, 所以说打乱版本号的时间戳是有可能的. 如果时间戳被打乱了, 大多数操作都不会受到影响, 毕竟它们都是使用版本号的整数编号作为版本 号的标识, 但是当你用日期指定版本号范围时, Subversion 返回的数据很可 能不是你所想要的. 导致版本号时间戳不再有序的常见操作是把多个仓库的 历史组合成单独的一个.