在继续之前你一定要知道如何识别版本库的一个修订版本,像你在“修订版本”一节看到的,一个修订版本就是版本库的一个“快照”,当你的版本库持续扩大,你必须有手段来识别这些快照。
你可以使用--revision
(-r
)参数来选择特定修订版本(svn --revision REV),你也可以指定在两个修订版本之间的一个范围 (svn --revision REV1:REV2)。你可以在Subversion中通过修订版本号、关键字或日期指定特定修订版本。
当你新建了一个Subversion版本库,从修订版本号0开始,每一次成功的提交加1,当你提交成功,Subversion告诉客户端这个新版本号:
$ svn commit --message "Corrected number of cheese slices." Sending sandwich.txt Transmitting file data . Committed revision 3.
如果你想在未来使用这个版本(我们将在此章的后面讲述我们这样做的方式和原因),你可以通过号码“3”指定。
Subversion客户端可以理解一些修订版本关键字,这些关键字可以用来代替--revision
的数字参数,这会被Subversion解释到特定版本:
工作拷贝中的每一个目录都有一个叫作.svn
的管理目录,工作目录中的每一个文件,Subversion在管理区域为它保留了一个备份,这是上一个版本(叫做“BASE”版本)没有修改的(没有关键字变化,没有行结束符号转化,没有任何改动)拷贝,我们把这个文件当作原始拷贝或基准文件使用,它与版本库中的文件完全一样。
版本库中最新的(或者是“最年轻的”)版本。
工作拷贝中一个条目的修订版本号,如果这个版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。
在BASE
版本之前(或在Base)一个项目最后修改的版本。
一个项目最后修改版本之前的那个版本(技术上为COMMITTED -1)。
PREV
、BASE
、和COMMITTED
指的都是本地路径而不是URL。
下面是一些关键字使用的例子,不要担心现在没有意义,我们将在本章的后面解释这些命令:
$ svn diff --revision PREV:COMMITTED foo.c
# shows the last change committed to foo.c
$ svn log --revision HEAD
# shows log message for the latest repository commit
$ svn diff --revision HEAD
# compares your working file (with local changes) to the latest version
# in the repository
$ svn diff --revision BASE:HEAD foo.c
# compares your “pristine” foo.c (no local changes) with the
# latest version in the repository
$ svn log --revision BASE:HEAD
# shows all commit logs since you last updated
$ svn update --revision PREV foo.c
# rewinds the last change on foo.c
# (foo.c's working revision is decreased)
这些关键字允许你执行许多常用(而且有用)的操作,而不必去查询特定的修订版本号,或者记住本地拷贝的修订版本号。
在任何你使用特定版本号和版本关键字的地方,你也可以在“{}”中使用日期,你也可通过日期或者版本号配合使用来访问一段时间的修改!
如下是一些Subversion能够接受的日期格式,注意在日期中有空格时需要使用引号。
$ svn checkout --revision {2002-02-17} $ svn checkout --revision {15:30} $ svn checkout --revision {15:30:00.200000} $ svn checkout --revision {"2002-02-17 15:30"} $ svn checkout --revision {"2002-02-17 15:30 +0230"} $ svn checkout --revision {2002-02-17T15:30} $ svn checkout --revision {2002-02-17T15:30Z} $ svn checkout --revision {2002-02-17T15:30-04:00} $ svn checkout --revision {20020217T1530} $ svn checkout --revision {20020217T1530Z} $ svn checkout --revision {20020217T1530-0500} …
当你指定一个日期,Subversion会在版本库找到接近这个日期的最新版本:
$ svn log --revision {2002-11-28} ------------------------------------------------------------------------ r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines …
你可以使用时间段,Subversion会找到这段时间的所有版本:
$ svn log --revision {2002-11-20}:{2002-11-29} …
我们也曾经指出,你可以混合日期和修订版本号:
$ svn log --revision {2002-11-20}:4040
用户一定要认识到这种精巧会成为处理日期的绊脚石,因为一个版本的时间戳是作为一个属性存储的—不是版本化的,而是可以编辑的属性—版本号的时间戳可以被修改,从而建立一个虚假的年代表,也可以被完全删除。这将大大破坏Subversion的这种时间—版本转化功能的表现。