版本号指示器
我们已经在 “版本号”一节 说过, Subversion 的版本号非常直观—随着提交的不断增多, 表示版本号的整数 也不断增大, 但是用不了多久, 用户就再也记不清每个版本号包含了哪些修改. 幸运的是, Subversion 的典型工作流程不太经常要求用户提供版本号, 对于 那些确实需要版本号的操作而言, 用户可以从提交日志中看到所需的版本号, 或者 使用在特定语境下可以表示特定版本号的关键字.
注意 | |
---|---|
在引用版本号时, 在数字的左边增加一个前缀 “ |
但是在少数情况下, 用户必须及时精确地描述出版本号, 可是手上却没有合适的参数. 所以除了用整数指定版本号外, svn 还支持另外两种指定版本 号的形式: 版本号关键字 (revision keywords) 和版本号日期.
注意 | |
---|---|
在指定版本号范围时, 可以混合使用不同形式的版本号指示器, 例如你可 以把 |
版本号关键字
Subversion 支持理解的版本号关键字有很多个, 可以用这些关键字替换 选项 --revision
(-r
) 后面的整数, 这些关键字会被 Subversion 解释成特定的版本号:
HEAD
仓库中最近的 (或最年轻的) 版本号.
BASE
工作副本中的某一项目的版本号, 如果该项在本地被修改了, 则该 版本号引用的是修改前的项目.
COMMITTED
等于或早于
BASE
并且离它最近的一个版本号, 在该版本号中项目被修改了.PREV
项目最后一次被修改时的版本号的前一个版本号, 从技术上讲它 就是
COMMITTED
-1.
从它们的描述可以看出, PREV
, BASE
和 COMMITTED
只能引用工作 副本中的路径, 而 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 早了一天吗
如果用户指定了一个日期作为版本号, 但没有指定一天中的时间 (例如 2006-11-27
), 你可能希望 Subversion 得到的是 11 月 27 号这一天的最后一个版本号, 可事实上是 Subversion 得到的是 26 号或者更早的版本号. 记住 Subversion 要找的是离那天 最近 的仓库的版本号, 如果没有指定时间, 例如 2006-11-27
, Subversion 默认时间是 00:00:00
, 所以不会出现 27 号那天的版本号.
如果你希望 27 号的版本号也在搜索的范围里, 那就在参数中指定时间 ({"2006-11-27 23:59"}
), 或者干脆指定后一天 ({2006-11-28}
).
还可以指定一段日期范围, 此时 Subversion 会找到这段时间内的所有 版本号, 包括开始日期和结束日期:
$ svn log -r {2006-11-20}:{2006-11-29} …
警告 | |
---|---|
Subversion 能够根据版本号日期得到版本号是因为版本号的时间戳被维护 成一个串行化的序列—版本号越年轻, 时间戳也就越年轻. 但是时间戳 是存放在版本号的 |