本手册描述了 Subversion 1.6.x 版本系列。如果您正在运行其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/,并参阅适合您 Subversion 版本的手册版本。

名称

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

概要

svn log [路径]

svn log URL[@版本号] [路径...]

描述

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

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

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

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

选项

--change (-c) ARG
--incremental
--limit (-l) NUM
--quiet (-q)
--revision (-r) REV
--stop-on-copy
--targets FILENAME
--use-merge-history (-g)
--verbose (-v)
--with-all-revprops
--with-no-revprops
--with-revprop ARG
--xml

示例

您可以通过在顶部运行 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 | …

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

$ 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 运行 log 操作,要么指定您知道在该版本中发生了更改的路径。

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

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