本手册是为了描述 Subversion 1.6.x 系列而编写的。如果您运行的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您的 Subversion 版本的手册。

查看历史记录

您的 Subversion 版本库就像一台时光机。它会记录每次提交的更改,并允许您通过检查文件的先前版本和目录以及伴随它们的元数据来探索此历史记录。使用单个 Subversion 命令,您可以签出版本库(或恢复现有工作副本),使其完全与过去任何日期或修订号时的版本相同。但是,有时您只想窥视过去,而不是进入过去。

几个命令可以为您提供版本库中的历史数据

svn diff

显示特定更改的行级详细信息

svn log

向您显示广泛的信息:附带修订版日期和作者信息的日志消息以及每个修订版中更改的路径

svn cat

检索特定修订号中存在的文件并在屏幕上显示它

svn list

显示任何给定修订版中目录中的文件

查看历史更改的详细信息

我们之前已经见过 svn diff——它以统一 diff 格式显示文件差异;我们使用它来显示提交到版本库之前对工作副本的本地修改。

事实上,事实证明,svn diff三种不同的用法

  • 检查本地更改

  • 将您的工作副本与版本库进行比较

  • 比较版本库修订版

检查本地更改

正如我们所见,在没有选项的情况下调用 svn diff 将比较您的工作文件与 .svn 区域中缓存的 原始 副本

$ svn diff
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

比较工作副本与版本库

如果传递了单个 --revision (-r) 编号,则将您的工作副本与版本库中的指定修订版进行比较

$ svn diff -r 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

比较版本库修订版

如果通过 --revision (-r) 传递了用冒号分隔的两个修订版编号,则直接比较这两个修订版

$ svn diff -r 2:3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 2)
+++ rules.txt	(revision 3)
@@ -1,4 +1,4 @@
 Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
 Everything in moderation
 Chew with your mouth open
$

比较一个修订版与前一个修订版的更方便方法是使用 --change (-c) 选项

$ svn diff -c 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 2)
+++ rules.txt	(revision 3)
@@ -1,4 +1,4 @@
 Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
 Everything in moderation
 Chew with your mouth open
$

最后,您甚至可以在本地机器上没有工作副本的情况下比较版本库修订版,只需在命令行上包含相应的 URL 即可

$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt
…
$

生成历史更改列表

要查找有关文件或目录历史记录的信息,请使用 svn log 命令。 svn log 将为您提供谁对文件或目录进行了更改、在哪个修订版中更改、该修订版的时间和日期以及(如果提供)与提交相关的日志消息的记录

$ svn log
------------------------------------------------------------------------
r3 | sally | 2008-05-15 23:09:28 -0500 (Thu, 15 May 2008) | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | 2008-05-14 18:43:15 -0500 (Wed, 14 May 2008) | 1 line

Added main() methods.
------------------------------------------------------------------------
r1 | sally | 2008-05-10 19:50:31 -0500 (Sat, 10 May 2008) | 1 line

Initial import
------------------------------------------------------------------------

请注意,日志消息默认情况下以 反时间顺序 打印。如果您希望按特定顺序查看不同范围的修订版,或者只查看单个修订版,请传递 --revision (-r) 选项

表 2.1. 常用日志请求

命令 描述
svn log -r 5:19 按时间顺序显示修订版 5 到 19 的日志
svn log -r 19:5 按反时间顺序显示修订版 5 到 19 的日志
svn log -r 8 仅显示修订版 8 的日志

您还可以检查单个文件或目录的日志历史记录。例如

$ svn log foo.c
…
$ svn log http://foo.com/svn/trunk/code/foo.c
…

这些将仅显示 只有工作文件(或 URL)更改的修订版的日志消息。

如果您想了解更多有关文件或目录的信息,svn log 还接受一个 --verbose (-v) 选项。由于 Subversion 允许您移动和复制文件和目录,因此能够跟踪文件系统中的路径更改非常重要。因此,在详细模式下,svn log 将在其输出中包含修订版中更改的路径列表

$ svn log -r 8 -v
------------------------------------------------------------------------
r8 | sally | 2008-05-21 13:19:25 -0500 (Wed, 21 May 2008) | 1 line
Changed paths:
   M /trunk/code/foo.c
   M /trunk/code/bar.h
   A /trunk/code/doc/README

Frozzled the sub-space winch.

------------------------------------------------------------------------

svn log 还接受一个 --quiet (-q) 选项,它会抑制日志消息的主体。与 --verbose (-v) 结合使用时,它只给出更改文件的名称。

浏览版本库

使用 svn catsvn list,您可以查看文件的各种修订版和目录,而无需更改工作副本的工作修订版。事实上,您甚至不需要工作副本就可以使用它们中的任何一个。

svn cat

如果您想检查文件的早期版本,而不是检查两个文件之间的差异,您可以使用 svn cat

$ svn cat -r 2 rules.txt
Be kind to others
Freedom = Chocolate Ice Cream
Everything in moderation
Chew with your mouth open
$

您也可以将输出直接重定向到文件

$ svn cat -r 2 rules.txt > rules.txt.v2
$

svn list

svn list 命令会向您显示版本库目录中的哪些文件,而不会实际将文件下载到您的本地机器

$ svn list http://svn.example.com/repo/project
README
branches/
tags/
trunk/

如果您想要更详细的列表,请传递 --verbose (-v) 标志,以获得类似这样的输出

$ svn list -v http://svn.example.com/repo/project
  23351 sally                 Feb 05 13:26 ./
  20620 harry            1084 Jul 13  2006 README
  23339 harry                 Feb 04 01:40 branches/
  23198 harry                 Jan 23 17:17 tags/
  23351 sally                 Feb 05 13:26 trunk/

这些列告诉您文件或目录最后修改的修订版、修改它的用户、如果是文件则的大小、最后修改的日期以及项目的名称。

[Warning] 警告

没有参数的 svn list 命令默认为当前工作目录的 版本库 URL而不是本地工作副本目录。毕竟,如果您想要本地目录的列表,您只需使用普通的 ls(或任何合理的非类 Unix 等效项)即可。

获取较旧的版本库快照

除了所有先前的命令之外,您还可以将 --revision (-r) 选项与 svn update 一起使用,以将整个工作副本 回溯到过去”:[8]

# Make the current directory look like it did in r1729.
$ svn update -r 1729
…
$
[Tip] 提示

许多 Subversion 新手尝试使用前面的 svn update 示例来 撤消” 已提交的更改,但这将不起作用,因为如果已更改的文件具有较新的修订版,则无法提交从回溯工作副本中获得的更改。参见 名为“恢复已删除的项目”的部分,了解如何 撤消” 提交。

如果您希望从较旧的快照创建全新的工作副本,您可以在修改典型的 svn checkout 命令时这样做。与 svn update 一样,您可以提供 --revision (-r) 选项。但出于我们在 名为“锚定修订版和操作修订版”的部分 中介绍的原因,您可能希望将目标修订版指定为 Subversion 的扩展 URL 语法的一部分。

# Checkout the trunk from r1729.
$ svn checkout http://svn.example.com/svn/repo/trunk@1729 trunk-1729
…
# Checkout the current trunk as it looked in r1729.
$ svn checkout http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729
…
$

最后,如果您要构建一个发行版,并且希望从 Subversion 中捆绑您的文件,但不想让那些讨厌的 .svn 目录妨碍您,您可以使用 svn export 来创建版本库的一部分或全部的本地副本,不带 .svn 目录。此子命令的基本语法与 svn checkout 相同

# Export the trunk from the latest revision.
$ svn export http://svn.example.com/svn/repo/trunk trunk-export
…
# Export the trunk from r1729.
$ svn export http://svn.example.com/svn/repo/trunk@1729 trunk-1729
…
# Export the current trunk as it looked in r1729. 
$ svn export http://svn.example.com/svn/repo/trunk -r 1729 trunk-1729
…
$


[8] 看到了吗?我们告诉过您 Subversion 是时光机。