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

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

你可以使用这个:

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

它会向您显示指定用户(USERNAME)所做的每一个提交。

UPDATE

正如@bahrep所build议的, subversion 1.8带有一个--search选项。

这工作对我来说(我使用Subversion 1.8)

 svn log --search johnsmith77 -l 50 

除了作者匹配之外,这也会在提交信息中包含那个用户名的SVN提交,如果你的用户名不是一个普通的词,就不会发生。

-l 50是显示最近的50个条目。

svn没有内置的选项。 它有一个svn log --xml选项,允许你自己分析输出,并获得有趣的部分。

您可以编写一个脚本来parsing它,例如,在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 

因为每个人似乎都倾向于Linux(等):这是Windows的等价物:

 svn log [SVNPath]|find "USERNAME" 
 svn log | grep user 

大部分工作。

或者更准确:

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

虽然yvoyer的解决scheme工作正常,这里是一个利用SVN的XML输出,parsing它与xmlstarlet

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

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

这是我使用xslt的解决scheme。 不幸的是,xsltproc不是stream处理器,所以你必须给日志一个限制。 用法示例:

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

svnLogFilter.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> 

svnLogText.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> 

从Subversion 1.8开始,你可以在svn log命令中使用--search--search-and命令行选项 。

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

您可以使用Perl通过用户名来过滤日志, 维护提交消息。 只需设置$ /variables,它决定什么构成一个“行”在Perl中。 如果你把它设置为SVN日志条目的分隔符,Perl将一次读取一条logging,然后你应该能够匹配整个logging中的用户名。 见下文:

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

获取差异与签入。

获取版本号到一个文件中:

 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