svn log
svn log — 显示提交日志消息.
大纲
svn log [
PATH
]
svn log
URL
[@REV
] [PATH
...]
描述
显示仓库的日志消息. 如果没有指定目标参数, svn log 将显示当前工作副本目录的日志消息. 为了提炼输出结果, 你可以指定一个路径, 一个或多个版本号, 或路径与版本号的组合. Subversion 为一个本地路径打印的默认版本号范围是 BASE:1
.
如果用户只指定了一个 URL, 命令将会为 URL 内的所有文件打印日志 消息, 如果你在 URL 中添加了路径, 命令将只打印该路径的日志消息. Subversion 为一个 URL 打印的默认版本号范围是 BASE:1
.
如果添加了选项 --verbose
(-v
), svn log 还会额外打印在本次修改中受到影响的路径. 如果添加了选项 --quiet
(-q
), svn log 将不会打印日志消息的文本内容, 这个选项和 选项 --verbose
(-v
) 是兼容的.
即使在一次提交中受到影响的路径在命令行中出现了多次, 对应的日志 消息也只显示一次. 日志默认会跟随复制历史, 但可以用选项 --stop-on-copy
禁止跟随, 这可以用来判断创建分支的 时间点.
选项
--change
(-c
)ARG
--depth
ARG
--diff
--diff-cmd
CMD
--extensions
(-x
)ARG
--incremental
--internal-diff
--limit
(-l
)NUM
--quiet
(-q
)--revision
(-r
)REV
--search
ARG
--search-and
ARG
--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
)
如果你想串联多个 svn 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 | … -----------------
为了避免出现凌乱的双条连字符行, 可以为 svn log 加上选项 --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>
提示 | |
---|---|
有时候, 如果你用 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 一样能够把修改以 标准差异格式输出, 方法就是为 svn log 加上选项 --diff
:
$ 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 不会去匹配被修改的路径.
搜索模式 (也被称作文本表达式或 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. ----------------- $
提示 | |
---|---|
选项 |