本手册编写用于描述 Subversion 1.1。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅适合您 Subversion 版本的本书版本。
在我们继续之前,您应该了解一些关于如何在您的存储库中识别特定修订版本的信息。正如您在 名为“修订版本”的部分 中了解到的那样,修订版本是存储库在特定时间点的“快照”。当您继续提交并扩展您的存储库时,您需要一种机制来识别这些快照。
您可以使用--revision (-r) 开关加上您想要的修订版本 (svn --revision REV),或者您可以通过冒号分隔两个修订版本来指定一个范围 (svn --revision REV1:REV2)。Subversion 允许您通过数字、关键词或日期来引用这些修订版本。
当您创建一个新的 Subversion 存储库时,它从修订版本零开始,每次后续提交都会将修订版本号增加一。在您的提交完成后,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.
某个项目改变的最后修订版本之前的修订版本。(从技术上来说,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.)
这些关键词允许您执行许多常见(且有帮助)的操作,而无需查找特定的修订版本号或记住工作副本的精确修订版本。
在任何您指定修订版本号或修订版本关键词的地方,您也可以在花括号“{}”内指定日期。您甚至可以使用日期和修订版本一起访问存储库中的一系列更改!
以下是一些 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 执行的内部日期到修订版本的转换造成破坏。