特定のユーザーのコミットをSVNログに表示するにはどうすればよいですか?


161

特定のユーザーのコミットをsvnで表示するにはどうすればよいですか?svnログ用のスイッチは見つかりませんでした。


10
--searchSubversion 1.8以降のクライアントでオプションを使用します。
2016年

回答:


258

あなたはこれを使うことができます:

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

指定したユーザー(USERNAME)によって行われたすべてのコミットが表示されます。

更新

@bahrepで提案されているように、subversion 1.8に--searchオプションが付属しています。


6
このソリューションは完璧です。それが何をしているのかを理解したいのですが、それを説明するsedのドキュメントで何も見つかりませんでした。これが機能する理由について誰かが何か情報がありますか?
Matt Hulse、2012年

1
+1は私にも有効です。viと同様に、Unix / Linuxのディストリビューションでは、sedはおそらくPythonよりもユビキタスです。したがって、インストールについて心配する必要はありません。
therobyouknow

10
@MattHulseは、sedを使用して、指定された2つの正規表現(ユーザー名とダッシュ)の間のすべてに一致するため、機能し、それを出力するように指示します(p)。
Gijs

5
@therobyouknowいいえ、svn log作業コピーで実行する必要はありません。リポジトリを指定することもできますsvn log https://your-svn-repo
MBober 2013

4
これを行う必要はもうありません。--searchオプションをサポートするSubversion 1.8以降のクライアントを使用します。
2016年

101

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に追加されました:svnbook.red-bean.com/en/1.8/svn.ref.svn.c.log.html
bahrep

複数の著者を検索したい場合は、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 2016年

このソリューションは--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

私はpythonをインストールしていませんが、私の問題は無関係な方法で解決されていますが、あなたの解決策は機能していると思います、ありがとう!
mimrock 2010

3
マジックは力かもしれません。PythonはBashです。
n611x007 2012

13

誰もがlinux(et al)に傾いているように見えるので、以下はWindowsの同等機能です。

svn log [SVNPath]|find "USERNAME"

ありがとう!クライアントはWindowsを使用しているので、それは本当に役に立ちました。これは管理対象システムです。管理者権限がなく、cygwin / perl / whateverをインストールできません...
n13

8
svn log | grep user

ほとんどの部分で機能します。

またはより正確に:

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

おかげで、私はそのようにコミットメッセージを見ることができません。
mimrock 2010

@mimrockはい。-Aコンテキストを表示するためにgrepすることもできますが、この数は静的ですが、コミットメッセージは可変長です。あなたはsedまたは類似のもので解決策を作ることができますが、それは努力です。:P
モイヌディン

これは、GIT拡張機能(code.google.com/p/gitextensions)をインストールしてGIT Bashコマンドプロンプトを起動した場合、Windowsでも機能します。
Contango 2014年

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>


1

Perlを使用して、ユーザー名でログをフィルタリングできます し、コミットメッセージ維持できます。Perlで「行」を構成するものを決定する$ /変数を設定するだけです。これをSVNログのエントリの区切り文字に設定すると、Perlは一度に1つのレコードを読み取り、レコード全体でユーザー名を照合できるはずです。下記参照:

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

これは、ファイル名に基づいて一連のログ結果を検索する場合でも機能します。
ワルミク

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を使用して適切に解析する既存の回答は、より堅牢で柔軟になります。
tripleee 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.