本文件旨在介绍 Subversion 1.4 版本。如果您使用的是更新版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查看适合您的 Subversion 版本的文档。

查看历史记录

您的 Subversion 仓库就像一台时光机。它记录了所有提交的更改,并允许您通过检查文件的以前版本和目录以及随附的元数据来浏览此历史记录。使用单个 Subversion 命令,您可以检出仓库(或恢复现有的工作副本),使其与过去任何日期或版本号时的状态完全相同。但是,有时您只想查看过去,而不是进入过去。

有几个命令可以提供来自仓库的历史数据

svn log

显示广泛的信息:包含日期和作者信息的日志消息附加到修订版,以及每个修订版中更改的路径。

svn diff

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

svn cat

检索特定版本号的文件,并在屏幕上显示它。

svn list

显示给定版本中目录中的文件。

生成历史更改列表

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

$ svn log
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line

Added main() methods.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line

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

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

$ svn log -r 5:19    # shows logs 5 through 19 in chronological order

$ svn log -r 19:5    # shows logs 5 through 19 in reverse order

$ svn log -r 8       # shows log for revision 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 | 2002-07-14 08:15:29 -0500 | 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 结合使用时,它只提供更改文件的名称。

检查历史更改的详细信息

我们已经看到了 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 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.collab.net/repos/svn
README
branches/
clients/
tags/
trunk/

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

$ svn list -v http://svn.collab.net/repos/svn
  20620 harry            1084 Jul 13  2006 README
  23339 harry                 Feb 04 01:40 branches/
  21282 sally                 Aug 27 09:41 developer-resources/
  23198 harry                 Jan 23 17:17 tags/
  23351 sally                 Feb 05 13:26 trunk/

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

警告

没有参数的 svn list 默认情况下指向当前工作目录的仓库 URL不是本地工作副本目录。毕竟,如果您想查看本地目录的列表,您可以使用简单的 ls(或任何合理的非 Unix 等效项)。

获取旧的仓库快照

除了上述所有命令之外,您还可以使用 svn updatesvn checkout 以及 --revision 选项来将整个工作副本“回溯到过去[8]

$ svn checkout -r 1729 # Checks out a new working copy at r1729
…
$ svn update -r 1729 # Updates an existing working copy to r1729
…

提示

许多 Subversion 新手尝试使用上面的 svn update 示例来“撤消”已提交的更改,但这将不起作用,因为您无法提交从回溯工作副本中获得的更改,如果更改的文件具有更新的修订版。

最后,如果您正在构建发行版,并希望从 Subversion 中捆绑您的文件,但又不想让那些讨厌的 .svn 目录妨碍您,那么您可以使用 svn export 来创建您的仓库的所有或部分的本地副本,不带 .svn 目录。与 svn updatesvn checkout 一样,您还可以将 --revision 选项传递给 svn export

$ svn export http://svn.example.com/svn/repos1 # Exports latest revision
…
$ svn export http://svn.example.com/svn/repos1 -r 1729
# Exports revision r1729
…


[8] 您看?我们告诉您 Subversion 是一台时光机。