web-dev-qa-db-ja.com

すべてのSubversionコミット作成者ユーザー名のリストを取得する方法は?

SVNリポジトリ全体または特定のリソースパスの一意のコミット作成者のリストを取得する効率的な方法を探しています。私はこれのためのSVNコマンドを見つけることができませんでした(そしてそれを期待していません)が、私はこれまでにターミナル(OS Xで)で試したことより良い方法があるかもしれないと思っています:

svn log --quiet | grep "^r" | awk '{print $3}'

svn log --quiet --xml | grep author | sed -E "s:</?author>::g"

これらのどちらでも、1行に1人の著者名が表示されますが、どちらもかなりの量の追加情報を除外する必要があります。また、同じ著者名の重複を処理しないため、少数の著者による多くのコミットでは、大量の冗長性がネットワーク上を流れます。多くの場合、一意の著者ユーザー名を表示したいだけです。 (実際にはmight各作成者のコミットカウントを推測するのが便利ですが、これらの場合でも、代わりに集計データを送信する方が良いでしょう。)

私は通常、クライアントのみのアクセスで作業しているので、svnadminコマンドはあまり有用ではありませんが、必要であれば、厳密に必要な場合またははるかに効率的な場合、リポジトリ管理者に特別な恩恵を求めることができます。私が作業しているリポジトリには、数万件のコミットと多くのアクティブなユーザーがいます。誰にも迷惑をかけたくありません。

70
Quinn Taylor

重複を除外するには、出力を取得してパイプ処理します:sort | uniq。したがって:

svn log --quiet | grep "^r" | awk '{print $3}' | sort | uniq

これがあなたが尋ねることをする方法であるならば、私は驚かないでしょう。 Unixツールは、多くの場合、ユーザーが他のツールで高度な処理と分析を行うことを期待しています。

追伸考えてみると、grepawkをマージできます...

svn log --quiet | awk '/^r/ {print $3}' | sort | uniq

P.P.S.ケビン・リードあたり...

svn log --quiet | awk '/^r/ {print $3}' | sort -u

P3.S。カンごとに、スペースの代わりにスペースの代わりに垂直バーを使用して、スペースを含む名前を適切に処理します(Python例)も更新しました...

svn log --quiet | awk -F ' \\\\|' '/^r/ {print $2}' | sort -u

より効率的にするには、Perlのワンライナーを使用できます。私はPerlをよく知らないので、Pythonでそれをやろうと思います:

#!/usr/bin/env python
import sys
authors = set()
for line in sys.stdin:
    if line[0] == 'r':
        authors.add(line.split('|')[1].strip())
for author in sorted(authors):
    print(author)

または、カウントが必要な場合:

#!/usr/bin/env python
from __future__ import print_function # Python 2.6/2.7
import sys
authors = {}
for line in sys.stdin:
    if line[0] != 'r':
        continue
    author = line.split('|')[1].strip()
    authors.setdefault(author, 0)
    authors[author] += 1
for author in sorted(authors):
    print(author, authors[author])

次に実行します:

svn log --quiet | ./authorfilter.py
85
Mike DeSimone

PowerShellで、場所を作業コピーに設定し、このコマンドを使用します。

_svn.exe log --quiet |
? { $_ -notlike '-*' } |
% { ($_ -split ' \| ')[1] } |
Sort -Unique
_

_svn.exe log --quiet_の出力形式は次のようになります。

_r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)
------------------------------------------------------------------------
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013)
------------------------------------------------------------------------
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013)
_

_? { $_ -notlike '-*' }_を使用して、水平方向のルールをフィルタリングします。

_r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)
r20208 | dispy | 2013-12-04 16:33:53 +0000 (Wed, 04 Dec 2013)
r20207 | lala | 2013-12-04 16:28:15 +0000 (Wed, 04 Dec 2013)
r20206 | po | 2013-12-04 14:34:32 +0000 (Wed, 04 Dec 2013)
r20205 | tinkywinky | 2013-12-04 14:07:54 +0000 (Wed, 04 Dec 2013)
_

レコードを配列に変換するには、_' \| '_で分割します。

_$ 'r20209 | tinkywinky | 2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)' -split ' \| '
r20209
tinkywinky
2013-12-05 08:56:29 +0000 (Thu, 05 Dec 2013)
_

2番目の要素は名前です。

各行の配列を作成し、% { ($_ -split ' \| ')[1] }で2番目の要素を選択します。

_tinkywinky
dispy
lala
po
tinkywinky
_

_Sort -Unique_で一意の出現を返します。これにより、出力が副作用としてソートされます。

_dispy
lala
po
tinkywinky
_

私はWindowsでこれをしなければならなかったので、Super Sed( http://www.pement.org/sed/ )-のWindowsポートを使用して置き換えましたAWKおよびGREPコマンド:

svn log --quiet --xml | sed -n -e "s/<\/\?author>//g" -e "/[<>]/!p" | sort | sed "$!N; /^\(.*\)\n\1$/!P; D" > USERS.txt

これは、すべてのマシンに存在しない可能性のあるウィンドウ「ソート」を使用します。

9
Adam Rofer
svn log  path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt

このコマンドには、偽の値を排除するgrep '|'が追加されています。それ以外の場合、'r'で始まるランダムコミットが含まれるため、コミットメッセージの単語が返されます。

2
crankparty

PowershellはXMLをサポートしているため、文字列出力を解析する必要がありません。

これは、複数のリポジトリにわたるユーザーの一意のリストを取得するためにMacで使用した簡単なスクリプトです。

#!/usr/bin/env pwsh

$repos = @(
    'Common/'
    'Database/'
    'Integration/'
    'Reporting/'
    'Tools/'
    'Web/'
    'Webservices/'
)

foreach ($repo in $repos) {
    $url = "https://svn.example.com:8443/svn/$repo"
    $users += ([Xml](svn log $url --xml)).log.logentry.author | Sort-Object -Unique
}

$users | Sort-Object -Unique
0
Jason C

使用できるリモートリポジトリの1つ:

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq
0
lvthillo