在我们继续之前,你应该知道一点怎样在你的资料库中标识一个特定的修订版。如你在“修订版(Revision)”一节中学到的那样, 修订版是资料库在某个特定时刻的“快照”。在你不断提交和增加你的资料库内容时,需要一种机制来标识这些快照。
为了指定修订版,你要用--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”修订版)中文件的未修改的(没有关键字展开,没有换行符转换,什么都没改)副本,
我们称这个副本为文件的原始拷贝(pristine copy)或者基础文本(text-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 mods) to the latest version
# in the repository.
$ svn diff --revision BASE:HEAD foo.c
# compares your “pristine” foo.c (no local mods) 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.)
这些关键字帮助你完成很多日常工作,而不需要寻找特定的修订版号码或者记住你的工作副本的准确的修订版。
A 任何你可以指定修订版号码或修订版关键字的地方,你也可以用一对花括号“{}”来指定日期。你甚至可以同时使用日期和修订版来访问一个范围内的修改。
这儿有一些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中使用日期时的一个微妙的地方,它可能会成为一个很大的障碍。 由于一个修订版的时间戳是作为修订版的一个属性存储的,这个属性是不版本化的,可以修改的。 修订版时间戳可以被修改成与真正的时间表完全不同,甚至能完全被删除。这会对Subversion内部做日期到修订版的转换带来严重破坏。