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


161

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


10
--search在Subversion 1.8或更高版本的客户端上使用选项。
bahrep

Answers:


258

您可以使用此:

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

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

更新

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


6
这个解决方案是完美的。我想了解它在做什么,但是我无法在解释该问题的sed文档中找到任何内容。任何人都知道为什么这样工作吗?
Matt Hulse 2012年

1
+1也对我有用。像vi一样,在Unix / Linux上发行的发行版可能比Python普及得多,因此无需担心安装。
therobyouknow 2012年

10
@MattHulse之所以起作用,是因为它使用sed来匹配两个指定的正则表达式(用户名和破折号)之间的所有内容,然后告诉它打印该内容(即p)。
Gijs 2012年

5
@therobyouknow不,您不需要执行svn log工作副本。您也可以指定存储库,即svn log https://your-svn-repo
MBober

4
无需再这样做了。使用Subversion 1.8或更高版本的支持该--search选项的客户端。
bahrep

100

对于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



如果您要搜索多个作者,svn log --search foo --search bar -l 30If multiple --search options are provided, a log message is shown if it matches any of the provided search patterns.
zhuguowei

此解决方案也可以与--diff参数一起使用(以显示更改的代码)
joro

如果用户名是单词的常用(部分),有什么方法可以过滤提交消息中的出现?
Tor Klingberg

17

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

这就是为什么我也添加了“ bash”标签。
mimrock 2010年

您可以编写一个实用程序脚本来解析它-参见我的示例
Avi 2010年

我没有安装python,但是虽然我的问题以无关的方式解决了,但是我认为您的解决方案正在工作,谢谢!
mimrock 2010年

3
魔术就是力量。Python是Bash。
n611x007 2012年

13

由于每个人似乎都倾向于linux(et al):这是Windows的等效版本:

svn log [SVNPath]|find "USERNAME"

谢谢!客户端正在使用Windows,因此确实有所帮助。这是一个受管系统,我没有管理员权限,无法安装cygwin / perl /其他...
n13 2013年

8
svn log | grep user

大多数情况下有效。

或更准确地说:

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

谢谢,但是我看不到提交消息。
mimrock 2010年

@mimrock是的。您可以使用grep -A来显示上下文,但是此数字是静态的,而提交消息的长度是可变的。您可以使用sed或类似的解决方案,但这是很努力的。:P
moinudin

如果您安装了GIT扩展程序(code.google.com/p/gitextensions)并启动GIT Bash命令提示符,则在Windows下也可以使用。
Contango 2014年

1
@marcog为获得真正的完整性,请列出该修订列表,并仅用它们进行另一个调用: | awk '{ print "-" $1 }' | xargs svn log
Izkata 2014年

5

尽管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查询。


3

这是我使用xslt的解决方案。但是,不幸的是,xsltproc不是流处理器,因此您必须给log一个限制。用法示例:

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>


1

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

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

即使您要根据文件名查找一堆日志结果,此方法也可以使用!
walmik 2012年

1

与检入一起获取差异。

将修订号保存到文件中:

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

现在通读文件并为每个修订版执行差异:

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

0

我已经用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

使用XML并正确解析它的现有答案将更加健壮和灵活。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.