本文字档尚未完工,内容随时可能变更,可能并不准确地描述 Apache™ Subversion® 软件的任何已发布版本。将本页添加书签或以其他方式将其推荐给他人可能不是明智之举。请访问 http://svnbooks.subversion.org.cn/,查看本书的稳定版本。

名称

svn log — 显示提交日志消息。

概要

svn log [PATH]

svn log URL[@REV] [PATH...]

描述

显示存储库中的日志消息。如果未提供任何参数,svn log 将显示工作副本当前工作目录(包括工作目录)内所有文件和目录的日志消息。您可以通过指定路径、一个或多个版本或两者的组合来细化结果。本地路径的默认版本范围为 BASE:1

如果您仅指定 URL,它将打印 URL 所包含内容的日志消息。如果您在 URL 后添加路径,则只会打印该 URL 下这些路径的日志消息。URL 的默认版本范围为 HEAD:1

使用 --verbose (-v),svn log 还将打印每个日志消息的所有受影响路径。使用 --quiet (-q),svn log 不会打印日志消息正文本身,这与 --verbose (-v) 兼容。

即使显式请求了该版本中多个受影响路径,每个日志消息也只会打印一次。默认情况下,日志会遵循复制历史记录。使用 --stop-on-copy 禁用此行为,这在确定分支点时很有用。

选项

示例

您可以通过从顶部运行 svn log 来查看工作副本中所有更改路径的日志消息

$ svn log
------------------------------------------------------------------------
r20 | harry | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Tweak.
------------------------------------------------------------------------
r17 | sally | 2003-01-16 23:21:19 -0600 (Thu, 16 Jan 2003) | 2 lines
…

检查工作副本中特定文件的全部日志消息

$ svn log foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果您手边没有工作副本,可以记录 URL

$ svn log http://svn.red-bean.com/repos/test/foo.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

如果您想要同一个 URL 下的多个不同路径,可以使用 URL [PATH...] 语法

$ svn log http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line

Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line

Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

使用 --verbose (-v) 选项,svn log 将包含有关每个显示版本中更改路径的信息。这些路径将显示出来,每行输出一个路径,并带有指示对路径进行了哪种类型更改的操作代码。

$ svn log -v http://svn.red-bean.com/repos/test/ foo.c bar.c
------------------------------------------------------------------------
r32 | sally | 2003-01-13 00:43:13 -0600 (Mon, 13 Jan 2003) | 1 line
Changed paths:
   M /foo.c

Added defines.
------------------------------------------------------------------------
r31 | harry | 2003-01-10 12:25:08 -0600 (Fri, 10 Jan 2003) | 1 line
Changed paths:
   A /bar.c

Added new file bar.c
------------------------------------------------------------------------
r28 | sally | 2003-01-07 21:48:33 -0600 (Tue, 07 Jan 2003) | 3 lines
…

svn log 只使用少量操作代码,这些代码与 svn update 命令使用的代码类似

A

项目已添加。

D

项目已删除。

M

项目上的属性或文本内容已更改。

R

项目已替换为同一位置的另一个项目。

除了操作代码(出现在更改路径之前)之外,使用 --verbose (-v) 选项的 svn log 还会指明路径是否由于复制操作而添加或替换。它通过在这些路径后面打印 (from COPY-FROM-PATH:COPY-FROM-REV) 来实现。

当您连接对 log 命令的多个调用的结果时,您可能希望使用 --incremental 选项。 svn log 通常会在日志消息的开头、每个后续日志消息之后以及最终日志消息之后打印一条虚线。如果您对两个版本范围运行 svn log,您将得到以下结果

$ svn log -r 14:15
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
r15 | …

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

但是,如果您想将两个非连续日志消息收集到一个文件中,您可能需要执行以下操作

$ svn log -r 14 > mylog
$ svn log -r 19 >> mylog
$ svn log -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
------------------------------------------------------------------------
r19 | …

------------------------------------------------------------------------
------------------------------------------------------------------------
r27 | …

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

您可以使用 --incremental 选项避免输出中出现双虚线的混乱

$ svn log --incremental -r 14 > mylog
$ svn log --incremental -r 19 >> mylog
$ svn log --incremental -r 27 >> mylog
$ cat mylog
------------------------------------------------------------------------
r14 | …

------------------------------------------------------------------------
r19 | …

------------------------------------------------------------------------
r27 | …

当使用 --xml 选项时,--incremental 选项提供类似的输出控制

$ svn log --xml --incremental -r 1 sandwich.txt
<logentry
   revision="1">
<author>harry</author>
<date>2008-06-03T06:35:53.048870Z</date>
<msg>Initial Import.</msg>
</logentry>
[Tip] 提示

有时,当您对特定路径和特定版本运行 svn log 时,您可能根本没有看到任何日志信息输出,如下所示

$ svn log -r 20 http://svn.red-bean.com/untouched.txt
------------------------------------------------------------------------

这仅仅意味着该路径在该版本中没有修改。要获取该版本的日志信息,请对存储库的根 URL 运行日志操作,或者指定您知道在该版本中发生更改的路径

$ svn log -r 20 touched.txt 
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Made a change.
------------------------------------------------------------------------

从 Subversion 1.7 开始,用户可以利用一种特殊的输出模式,将 svn log 的信息与运行 svn diff 对同一目标的每个日志版本的输出结果相结合。只需使用 --diff 选项调用 svn log 即可触发此输出模式。

$ svn log -r 20 touched.txt --diff
------------------------------------------------------------------------
r20 | sally | 2003-01-17 22:56:19 -0600 (Fri, 17 Jan 2003) | 1 line

Made a change.

Index: touched.txt
===================================================================
--- touched.txt	(revision 19)
+++ touched.txt	(revision 20)
@@ -1 +1,2 @@
 This is the file 'touched.txt'.
+We add such exciting text to files around here!
------------------------------------------------------------------------
$

svn diff 一样,您也可以使用许多控制差异生成方式的选项,包括 --depth--diff-cmd--extensions (-x)。

从 Subversion 1.8 开始,用户可以使用 --search--search-and 选项过滤 svn log 输出。使用这些选项时,只有当版本的作者、日期、日志消息文本或更改路径列表与搜索模式匹配时,才会显示日志消息。按更改补丁搜索需要 --verbose 选项,否则 svn log 不会显示更改路径,因此无法对其进行过滤。

搜索模式(也称为 glob 或 shell 通配符模式)可以包含常规字符和以下通配符字符

?

匹配任何单个字符。

*

匹配任意数量的任意字符。

[ABC]

匹配括号内列出的任何字符。

使用多个 --search 参数将显示至少在一个选项中匹配指定模式的日志消息。例如

$ svn log --search sally --search harry https://svn.red-bean.com/repos/test
------------------------------------------------------------------------
r1701 | sally | 2011-10-12 22:35:30 -0600 (Wed, 12 Oct 2011) | 1 line

Add a reminder.
------------------------------------------------------------------------
r1564 | harry | 2011-10-09 22:35:30 -0600 (Sun, 09 Oct 2011) | 1 line

Merge r1560 to the 1.0.x branch.
------------------------------------------------------------------------
$
        

使用 --search--search-and 选项将显示匹配来自两个选项的组合模式的日志消息。例如

$ svn log --verbose --search sally --search-and /foo/bar https://svn.red-bean.com/repos/test
------------------------------------------------------------------------
r1555 | sally | 2011-07-15 22:33:14 -0600 (Fri, 15 Jul 2011) | 1 line
Changed paths:
M /foo/bar/src.c

Typofix.
------------------------------------------------------------------------
r1530 | sally | 2011-07-13 07:24:11 -0600 (Wed, 13 Jul 2011) | 1 line
Changed paths:
M /foo/bar
M /foo/build

Fix up some svn:ignore properties.
------------------------------------------------------------------------
$
[Tip] 提示

--search--search-and 选项实际上并不会执行搜索。它们只是过滤 svn log 输出,仅显示与指定模式匹配的日志消息。因此,如果使用 --limit,它会限制搜索的日志消息数量,而不是将输出限制为特定数量的匹配日志消息。

TortoiseSVN 官方中文版 1.14.7 发布