如何在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>------------------------------------------------------------------------
</xsl:text> </xsl:template> <xsl:template name="entrymatcher" match="logentry"> <xsl:text>------------------------------------------------------------------------
</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>

</xsl:text> <xsl:if test="paths"> <xsl:text>Changed paths:
</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>
</xsl:text> </xsl:for-each> </xsl:if> <xsl:text>
</xsl:text> <xsl:value-of select="msg"/> <xsl:text>
</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