it-swarm.com.de

Wie bekomme ich eine Liste aller Benutzernamen von Subversion Commit Author?

Ich suche nach einer effizienten Methode, um die Liste der eindeutigen Commit-Autoren für ein SVN-Repository als Ganzes oder für einen bestimmten Ressourcenpfad abzurufen. Ich konnte keinen SVN-Befehl speziell dafür finden (und erwarte keinen), aber ich hoffe, dass es einen besseren Weg gibt als den, den ich bisher in Terminal (unter OS X) ausprobiert habe:

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

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

Beide geben mir einen Autorennamen pro Zeile, aber beide erfordern das Herausfiltern einer großen Menge zusätzlicher Informationen. Sie behandeln auch keine Duplikate desselben Autorennamens, so dass bei vielen Commits von wenigen Autoren jede Menge Redundanz über die Leitung fließt. Meistens möchte ich nur die eindeutigen Benutzernamen des Autors sehen. (Es ist tatsächlich möglicherweise praktisch, den Commit-Zähler für jeden Autor gelegentlich abzuleiten, aber selbst in diesen Fällen wäre es besser, wenn die aggregierten Daten stattdessen gesendet würden.) 

Ich arbeite im Allgemeinen nur mit Clientzugriff. Daher sind svnadmin-Befehle weniger nützlich, aber wenn nötig, kann ich den Repository-Administrator um einen besonderen Gefallen bitten, wenn dies unbedingt erforderlich oder viel effizienter ist. Die Repositories, mit denen ich arbeite, haben zehntausende Commits und viele aktive Benutzer, und ich möchte niemanden belästigen.

64
Quinn Taylor

Um Dubletten herauszufiltern, führen Sie Ihre Ausgabe durch und leiten Sie durch: sort | uniq. Somit:

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

Ich wäre nicht überrascht, wenn Sie auf diese Weise das tun, was Sie fragen. Unix-Tools setzen häufig voraus, dass der Benutzer mit anderen Tools ausgefallene Verarbeitung und Analyse vornimmt.

P.S. Kommen Sie, um darüber nachzudenken, können Sie die grep und awk...

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

P.P.S. Per Kevin Reid ...

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

P3.S. Verwenden Sie pro Kanal die vertikalen Striche anstelle von Leerzeichen als Feldtrennzeichen, um Namen mit Leerzeichen richtig zu behandeln (auch die Python-Beispiele wurden aktualisiert) ...

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

Um effizienter zu sein, können Sie einen Perl-Einzeiler verwenden. Ich kenne Perl nicht so gut, also würde ich es in Python tun:

#!/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)

Oder, wenn Sie gezählt haben wollen:

#!/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])

Dann würden Sie laufen:

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

Legen Sie in PowerShell Ihren Standort auf die Arbeitskopie fest und verwenden Sie diesen Befehl.

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

Das Ausgabeformat von svn.exe log --quiet sieht folgendermaßen aus:

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)

Filtern Sie die horizontalen Regeln mit ? { $_ -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)

Nach ' \| ' aufteilen, um einen Datensatz in ein Array zu verwandeln.

$ '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)

Das zweite Element ist der Name.

Machen Sie aus jeder Zeile ein Array und wählen Sie mit % { ($_ -split ' \| ')[1] } das zweite Element aus.

tinkywinky
dispy
lala
po
tinkywinky

Geben Sie eindeutige Vorkommen mit Sort -Unique zurück. Dies sortiert die Ausgabe als Nebeneffekt.

dispy
lala
po
tinkywinky

Ich musste dies in Windows tun, also habe ich den Windows-Port von Super Sed ( http://www.pement.org/sed/ ) - verwendet und die AWK- und GREP-Befehle ersetzt:

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

Hierbei werden Fenster "Sortieren" verwendet, die möglicherweise nicht auf allen Computern vorhanden sind.

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

Dieser Befehl hat den zusätzlichen grep '|', der falsche Werte beseitigt ..__ Ansonsten werden Random-Commits, die mit 'r' beginnen, eingeschlossen und die Wörter aus Commit-Nachrichten werden zurückgegeben.

2
crankparty

Powershell bietet Unterstützung für XML, sodass keine Zeichenfolgenausgabe mehr erforderlich ist.

Hier ist ein kurzes Skript, das ich auf einem Mac verwendet habe, um eine eindeutige Liste von Benutzern in mehreren Repositorys zu erhalten.

#!/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

Ein Remote-Repository, das Sie verwenden können:

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