本手册编写用于描述 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”修订版本)中存在的。我们将此文件称为 原始副本文本基础 版本,它始终是该文件在存储库中存在的精确逐字节副本。

HEAD

存储库中的最新修订版本。

BASE

工作副本中某个项目“原始”修订版本。

COMMITTED

某个项目在(或在)之前改变的最后修订版本BASE.

PREV

某个项目改变的最后修订版本之前的修订版本。(从技术上来说,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 执行的内部日期到修订版本的转换造成破坏。

TortoiseSVN 官方中文版 1.14.7 发布