如何在svn中显示特定用户的提交记录?我没有找到任何用于svn日志的开关。
svn log | sed -n '/USERNAME/,/-----$/ p'
--search
选项。p
)。 - Gijssvn log
。您也可以指定您的存储库,例如 svn log https://your-svn-repo
。 - MBober--search
选项的 Subversion 1.8 或更新版本的客户端即可。 - bahrep使用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.searchsvn log --search foo --search bar -l 30
。如果提供了多个--search选项,则只要匹配其中任何一个搜索模式,就会显示日志消息。 - zhuguoweiSVN没有内置选项来完成此操作。但是它有一个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
由于似乎大家都倾向于使用 Linux(等等):这里是 Windows 的等效替代方案:
svn log [SVNPath]|find "USERNAME"
svn log | grep user
大部分情况下都能正常工作。
更准确地说:
svn log | egrep 'r[0-9]+ \| user \|'
-A
来显示上下文,但这个数字是静态的,而提交信息的长度是可变的。你可以用sed或类似的工具来解决,但那需要花费一定的功夫。 :P - moinudin| awk '{ print "-" $1 }' | xargs svn log
。 - Izkata虽然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查询。
这里是我使用XSLT的解决方案。不幸的是,xsltproc不是流处理器,因此您必须给日志设置一个限制。例如用法:
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开始,您可以使用--search
和--search-and
命令行选项与svn log
命令一起使用。
因此,运行svn log --search JohnDoe
应该很简单。
svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'
获取与签入一起的差异信息。
将修订版本号写入文件:
svn log | sed -n '/USERNAME/,/-----$/ p'| grep "^r"
while read p; do svn log -v"$p" --diff ; done < Revisions.txt