すべてのSubversionコミット作成者のユーザー名のリストを取得するにはどうすればよいですか?


83

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

私は通常、クライアントのみのアクセスを使用svnadminしているため、コマンドはあまり役に立ちませんが、必要に応じて、厳密に必要な場合やはるかに効率的な場合は、リポジトリ管理者に特別なお願いをすることができます。私が使用しているリポジトリには、何万ものコミットと多くのアクティブユーザーがいるので、誰にも迷惑をかけたくありません。


6
Subversionは作成者名のインデックスを作成しないため(これらは単なるリビジョンプロパティです)、ログ全体をスキャンせずにインデックスを作成する方法はありません。ソリューションは、コミットあたりのコストによってのみ異なります。
ケビンリード

回答:


94

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

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

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

PS考えてみると、マージしgrepawk...

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

ケビンリードあたりのPPS..。

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

P 3 .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

有用な提案のための+1。私は気づいていましたがsort、そうuniqではありませんでした。後者は、-c各行の出現回数を付加するよりもパラメーターを受け取るようです。私はまだより効率的な(そしてスケーラブルな)方法を望んでいますが、これはピンチでトリックを行います。
クインテイラー

2
ちなみに、XPathが手元にある場合、クエリ//author/text()は作成者名だけをsvn log --xml確実に取得します。(Mac OS Xには、ほとんどこの仕事xpathをするコマンドがありますが、無関係なテキストを生成し、そうしないように構成することはできません。何か他のものがあるかもしれません。)
Kevin Reid

@ケビン、他の人があなたに投票できるように、あなたはあなた自身の答えを追加するべきです。私はあなたのすべてのコメント、特にsort / uniqのヒントが好きです。
クインテイラー

1
svnユーザー名にはスペースを含めることができるため、より正確なフィルタリングを使用することをお勧めしますawk -F " \\\\| " '{print $2}'
kan

2
素晴らしい答えですが、最後のawkを変更する必要がありましたが、svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -uそれ以外の場合は空の行になりました
MJar 2016

51

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番目の要素は名前です。

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

tinkywinky
dispy
lala
po
tinkywinky

で一意のオカレンスを返しSort -Uniqueます。これにより、出力が副作用としてソートされます。

dispy
lala
po
tinkywinky

1
Sort -Uniqueケース・小文字を区別しないで、あなたが使うべきSort-Object | Get-Unique –AsStringか、Select-Object -Unique大文字と小文字を区別チェックを取得する代わりに。
Tom Kuijsten 2015

2
または:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Nathan Moinvaziri 2017

9

これはWindowsで行う必要があったため、Super SedのWindowsポート(http://www.pement.org/sed/)を使用し、AWKおよびGREPコマンドを置き換えました。

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

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


:私はまた、フォルダを反復処理は、すべてのリポジトリのユニークなリストがコンパイルされることをバッチファイル作ったpastebin.com/CXiqLddp
アダムRofer

4

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

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

自分で理解するまでこのコマンドは見つかりませんでした...リモートリポジトリのユーザーにたとえばgitに変換してもらいたい場合(を参照git svn --help)、これはこのコマンドを実行するためのチェックアウトとしてのみ非常に便利です時間がかかりすぎる可能性があります。
seyfahni

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

このコマンドには、grep '|'誤った値を排除する追加機能があります。それ以外の場合は、'r'get includeで始まるランダムコミットが含まれるため、コミットメッセージからの単語が返されます。


そのため、--quietor-q引数が他の提案で使用されています。これにより、ログヘッダー(改訂、作成者、日付、時刻)のみが出力されます
v01pe 2013

0

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

Windows10のソリューション。

  1. バッチファイルを作成する printAllAuthor.bat
@echo off
for /f "tokens=3" %%a in ('svn log --quiet ^|findstr /r "^r"') do echo %%a
@echo on
  1. sortコマンドでbatファイルを実行する
printAllAuthor.bat | sort /unique >author.txt

PS:

  • ステップ2では、正しいパスでバッチファイルを実行する必要があります。パスを%PATH%に設定するか、正しいOSパス形式を使用してください。
  • ステップ2は、必要に応じてバッチファイルにすることもできます。

-2

より簡単な代替手段:

find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n

これは、これが実行されたときにファイルシステムに存在するcppファイルのみを調べます。
echristopherson 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.