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

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

10
请使用Subversion 1.8或更新版本的客户端,并使用“--search”选项。 - bahrep
11个回答

266
你可以使用这个:
svn log | sed -n '/USERNAME/,/-----$/ p' 

它会显示指定用户(USERNAME)所做的每个提交。 更新 如@bahrep建议的那样,subversion 1.8带有一个--search选项。

6
这个解决方案很完美。我想了解它在做什么,但我没有在sed文档中找到任何解释。有人知道为什么这样可以奏效吗? - Matt Hulse
10
它之所以有效,是因为它使用sed匹配两个指定正则表达式之间的所有内容(用户名和破折号),然后告诉它打印出来(p)。 - Gijs
5
@therobyouknow 不需要在工作副本上执行 svn log。您也可以指定您的存储库,例如 svn log https://your-svn-repo - MBober
1
我也可以使用。为了理解这个技巧,请观察:http://www.grymoire.com/Unix/Sed.html中的模式范围章节。 - Gur
4
不需要再这样做了。使用支持 --search 选项的 Subversion 1.8 或更新版本的客户端即可。 - bahrep
显示剩余3条评论

108

使用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

1
@Izkata 在 SVN 1.8 中添加了:http://svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html - bahrep
如果您想搜索多个作者,请使用命令svn log --search foo --search bar -l 30。如果提供了多个--search选项,则只要匹配其中任何一个搜索模式,就会显示日志消息。 - zhuguowei
该解决方案也可以与 --diff 参数一起使用(以显示更改的代码)。 - JRr
有没有办法在提交消息中过滤掉出现的用户名,如果该用户名是一个常见单词的一部分? - 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
你可以编写一个实用脚本来解析它 - 参见我的示例。 - Avi
我没有安装Python,但是虽然我的问题是通过其他方式解决的,我认为你的解决方案是有效的,谢谢! - mimrock
3
魔法即力量。Python就像Bash一样强大。 - n611x007

13

由于似乎大家都倾向于使用 Linux(等等):这里是 Windows 的等效替代方案:

svn log [SVNPath]|find "USERNAME"

谢谢!客户正在使用Windows,这真的很有帮助。这是一个托管系统,我没有管理员权限,也无法安装cygwin/perl/任何其他软件... - n13

8
svn log | grep user

大部分情况下都能正常工作。

更准确地说:

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

谢谢,但我不能以那种方式查看提交消息。 - mimrock
@mimrock 没错。你可以使用grep的-A来显示上下文,但这个数字是静态的,而提交信息的长度是可变的。你可以用sed或类似的工具来解决,但那需要花费一定的功夫。 :P - moinudin
如果您安装了GIT扩展(http://code.google.com/p/gitextensions/)并启动GIT Bash命令提示符,则此方法也适用于Windows。 - Contango
1
@marcog 为了真正的完整性,拿出那个修订版本列表并使用以下命令再次调用它们:| awk '{ print "-" $1 }' | xargs svn log - Izkata

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不是流处理器,因此您必须给日志设置一个限制。例如用法:

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>

3

1
你可以使用Perl按用户名过滤日志并维护提交消息。只需设置$/变量,它决定了在Perl中什么构成了“行”。如果将其设置为SVN日志条目的分隔符,则Perl将一次读取一个记录,然后您应该能够在整个记录中匹配用户名。请参见以下内容:
svn log | perl -ne 'BEGIN{$/="------------------------------------------------------------------------"} print if /USERNAME/'

这个可以根据文件名找到一堆日志结果! - walmik

1

获取与签入一起的差异信息。

将修订版本号写入文件:

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

现在阅读文件并执行每个版本的差异比较:
while read p; do   svn log -v"$p" --diff ; done < Revisions.txt 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接