如何在 svn 日志中显示特定用户的提交?

如何在 svn 中显示特定用户的提交? 我没有找到任何针对 svn 日志的开关。

107202 次浏览
svn log | grep user

大部分都有效。

或者更准确地说:

svn log | egrep 'r[0-9]+ \| user \|'

Svn 没有为此提供内置选项。它确实有一个 svn log --xml选项,允许您自己解析输出,并获得有趣的部分。

您可以编写一个脚本来解析它,例如,在 Python 2.6中:

import sys
from xml.etree.ElementTree import iterparse, dump


author = sys.argv[1]
iparse = iterparse(sys.stdin, ['start', 'end'])


for event, elem in iparse:
if event == 'start' and elem.tag == 'log':
logNode = elem
break


logentries = (elem for event, elem in iparse
if event == 'end' and elem.tag == 'logentry')


for logentry in logentries:
if logentry.find('author').text == author:
dump(logentry)
logNode.remove(logentry)

如果你把上面的 svnlogstripbyauthor.py 保存起来,你可以称之为:

svn log --xml other-options | svnLogStripByAuthor.py user

你可以用这个:

svn log | sed -n '/USERNAME/,/-----$/ p'

它将显示指定用户(USERNAME)的每次提交。

更新

正如@bahrep 所建议的,颠覆1.8带有 --search选项。

您可以使用 Perl 根据用户名 还有来过滤日志,以维护提交消息。只需设置 $/变量,它决定什么构成佩尔的“线”。如果将其设置为 SVN 日志条目的分隔符,Perl 将一次读取一条记录,然后您应该能够匹配整个记录中的用户名。见下文:

svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

因为似乎每个人都倾向于 linux (等等) : 下面是 Windows 版本:

svn log [SVNPath]|find "USERNAME"

虽然 yvoyer 的解决方案工作良好,但下面是一个利用 SVN 的 XML 输出,并用 xmlstarlet解析它的解决方案。

svn log --xml | xmlstarlet sel -t -m 'log/logentry' \
--if "author = '<AUTHOR>'" \
-v "concat('Revision ', @revision, ' ', date)" -n -v msg -n -n

从这里您可以进入更高级的 XML 查询。

使用 Subversion 1.8或更高版本:

svn log --search johnsmith77 -l 50

除了作者匹配之外,这还将在提交消息中显示包含该用户名的 SVN 提交,如果您的用户名不是一个常用词,则不应该发生这种情况。

-l 50将搜索限制在最近的50个条目。

--search ARG

筛选器记录消息,以仅显示与搜索模式 ARG 匹配的消息。

只有当提供的搜索模式匹配任何作者、日期、日志消息文本(除非使用 --quiet) ,或者如果还提供了 --verbose选项,则显示日志消息。

如果提供了多个 --search选项,则如果日志消息匹配所提供的任何搜索模式,则会显示该日志消息。

如果使用 --limit,它将限制搜索的日志消息的数量,而不是将输出限制为匹配的日志消息的特定数量。

Http://svnbook.red-bean.com/en/1.8/svn.ref.svn.html#svn.ref.svn.sw.search

以下是我使用 xslt 的解决方案。但不幸的是,xsltproc 不是流处理器,因此必须对日志进行限制。示例用法:

svn log -v --xml --limit=500  | xsltproc --stringparam author yonran /path/to/svnLogFilter.xslt  - | xsltproc /path/to/svnLogText.xslt  - | less

Xslt

<!--
svnLogFilter.xslt


Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml | xsltproc -stringparam author yonran svnLogFilter.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="author" select="''"/>
<xsl:strip-space elements="log"/>
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="lowercaseAuthor" select="translate($author, $uppercase, $lowercase)"/>


<xsl:template match="/log">
<xsl:copy>
<xsl:apply-templates name="entrymatcher"/>
</xsl:copy>
</xsl:template>


<xsl:template name="entrymatcher" match="logentry">
<xsl:variable name="lowercaseChangeAuthor" select="translate(author, $uppercase, $lowercase)"/>
<xsl:choose>
<xsl:when test="contains($lowercaseChangeAuthor, $lowercaseAuthor)">
<xsl:call-template name="insideentry"/>
</xsl:when>
<!--Filter out-->
<xsl:otherwise/>
</xsl:choose>
</xsl:template>




<xsl:template name="insideentry" match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>


</xsl:stylesheet>

Xslt

<!--
svnLogText.xslt


Usage: (note: use double dashes; I can't do double dashes in a XML comment)
svn log -xml -limit=1000 | xsltproc svnLogText.xslt -
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="author" select="''"/>
<xsl:param name="xml" select="false()"/>
<xsl:output method="text"/>


<xsl:template match="/log">
<xsl:apply-templates name="entrymatcher"/>
<xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
</xsl:template>


<xsl:template name="entrymatcher" match="logentry">
<xsl:text>------------------------------------------------------------------------&#xa;</xsl:text>
<xsl:text>r</xsl:text><xsl:value-of select="@revision"/>
<xsl:text> | </xsl:text>
<xsl:value-of select="author"/>
<xsl:text> | </xsl:text>
<xsl:value-of select="date"/>
<xsl:text>&#xa;&#xa;</xsl:text>
<xsl:if test="paths">
<xsl:text>Changed paths:&#xa;</xsl:text>
<xsl:for-each select="paths/path">
<xsl:text>   </xsl:text>
<xsl:value-of select="@action"/>
<xsl:text> </xsl:text>
<xsl:value-of select="."/>
<xsl:text>&#xa;</xsl:text>
</xsl:for-each>
</xsl:if>
<xsl:text>&#xa;</xsl:text>
<xsl:value-of select="msg"/>
<xsl:text>&#xa;</xsl:text>
</xsl:template>


</xsl:stylesheet>

在检查的同时得到差异。

将修订号存入文件:

svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"

现在通读每个版本的文件和执行 diff:

while read p; do   svn log -v"$p" --diff ; done < Revisions.txt

我写了一个 Python 脚本:

#!/usr/bin/python
# coding:utf-8


import sys


argv_len = len(sys.argv)




def help():
print 'Filter svnlog by user or date!       '
print 'USEAGE: svnlog [ARGs]                '
print 'ARGs:                                '
print '    -n[=name]:                       '
print '      filter by the special [=name]\n'
print '    -t[=date]:                       '
print '      filter by the special [=date]  '
print 'EXP:                                 '
print '1. Filter ruikye\'s commit log       \n'
print '     svn log -l 50 | svnlog -n=ruikye\n'




if not argv_len - 1:
help()
quit()


author = ''
date = ''


for index in range(1, argv_len):
argv = sys.argv[index]
if argv.startswith('-n='):
author = argv.replace('-n=', '')
elif argv.startswith('-t='):
date = argv.replace('-t=', '')
else:
help()
quit()


if author == '' and date == '':
help()
quit()




SPLIT_LINE =
'------------------------------------------------------------------------'
src = ''.join(sys.stdin.readlines()).replace('\n\n', '\n')
lines = src.split(SPLIT_LINE)


for line in lines:
if author in line and date in line:
print SPLIT_LINE, line


if len(lines):
print SPLIT_LINE

使用:

$ mv svnlog.py svnlog


$ chmod a+x svnlog


$ cd /usr/local/bin
$ ln -s ~/mycmd/svnlog filter


$ svn log | filter -n=ruikye -t=2015-03-04

从 Subversion 1.8开始,您可以使用 使用 ABC2命令的 ABC0和 --search-and命令行选项

所以它应该和运行 svn log --search JohnDoe一样简单。