本文档旨在描述 Subversion 1.2。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并参考适合您的 Subversion 版本的书籍版本。

检查历史记录

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

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

svn log

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

svn diff

显示文件随时间推移的具体更改细节。

svn cat

用于检索特定修订号中存在的任何文件,并在屏幕上显示它。

svn list

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

svn log

要查找有关文件或目录历史记录的信息,请使用 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 --revision 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

我们之前已经看到了 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 --revision 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 --revision 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
$

您不仅可以使用 svn diff 将工作副本中的文件与仓库进行比较,而且如果您提供一个 URL 参数,您可以在没有工作副本的情况下检查仓库中项目之间的差异。如果您想检查文件的更改而您的本地机器上没有工作副本,这将特别有用

$ svn diff --revision 4:5 http://svn.red-bean.com/repos/example/trunk/text/rules.txt
…
$

svn cat

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

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

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

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

您可能想知道为什么我们不直接使用 svn update --revision 将文件更新到较旧的修订版。我们可能更喜欢使用 svn cat 的原因有几个。

首先,您可能想使用外部 diff 程序(可能是图形程序,或者您的文件格式可能导致统一 diff 的输出没有意义)查看文件的两个修订版之间的差异。在这种情况下,您需要获取旧修订版的副本,将其重定向到文件,并将该文件和工作副本中的文件都传递给外部 diff 程序。

有时,查看文件的旧版本(而不是仅查看它与另一个修订版之间的差异)更容易。

svn list

svn list 命令显示仓库目录中有哪些文件,而无需实际将文件下载到本地机器

$ svn list http://svn.collab.net/repos/svn
README
branches/
clients/
tags/
trunk/

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

$ svn list --verbose http://svn.collab.net/repos/svn
   2755 harry          1331 Jul 28 02:07 README
   2773 sally               Jul 29 15:07 branches/
   2769 sally               Jul 29 12:07 clients/
   2698 harry               Jul 24 18:07 tags/
   2785 sally               Jul 29 19:07 trunk/

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

关于历史记录的最后一点

除了所有上述命令之外,您还可以使用 svn updatesvn checkout 以及 --revision 开关来将整个工作副本“倒流回过去[7]

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


[7] 看到了吧?我们告诉过您 Subversion 是一个时光机。

TortoiseSVN 官方中文版 1.14.7 发布