Wie erhalte ich eine Liste aller Benutzernamen von Subversion Commit-Autoren?

83

Ich suche nach einer effizienten Möglichkeit, 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) versucht habe:

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

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

Beides gibt mir einen Autorennamen pro Zeile, aber beide erfordern das Herausfiltern einer angemessenen Menge zusätzlicher Informationen. Sie verarbeiten auch keine Duplikate mit demselben Autorennamen, sodass bei vielen Commits von wenigen Autoren Tonnen von Redundanz über den Draht fließen. Meistens möchte ich nur die eindeutigen Benutzernamen des Autors sehen. (Es mag tatsächlich praktisch sein, gelegentlich die Anzahl der Festschreibungen für jeden Autor 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 Client-Zugriff, daher sind svnadminBefehle weniger nützlich. Bei Bedarf kann ich den Repository-Administrator jedoch um einen besonderen Gefallen bitten, wenn dies unbedingt erforderlich oder wesentlich effizienter ist. Die Repositorys, mit denen ich arbeite, haben Zehntausende von Commits und viele aktive Benutzer, und ich möchte niemanden belästigen.

Quinn Taylor
quelle
6
Subversion indiziert keine Autorennamen (sie sind nur eine Revisionseigenschaft), daher gibt es keine Möglichkeit, dies zu tun, ohne das gesamte Protokoll zu scannen. Lösungen variieren nur durch die Kosten pro Commit.
Kevin Reid

Antworten:

94

Um Duplikate herauszufiltern, nehmen Sie Ihre Ausgabe und leiten Sie sie durch : sort | uniq. So:

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

Ich wäre nicht überrascht, wenn dies der Weg wäre, um das zu tun, was Sie verlangen. Unix-Tools erwarten vom Benutzer häufig eine ausgefallene Verarbeitung und Analyse mit anderen Tools.

PS Wenn Sie darüber nachdenken, können Sie die grepund awk...

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

PPS Per Kevin Reid ...

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

P 3 .S. Per Kan, wobei die vertikalen Balken anstelle von Leerzeichen als Feldtrennzeichen verwendet werden, um Namen mit Leerzeichen richtig zu behandeln (auch die Python-Beispiele wurden aktualisiert) ...

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

Für mehr Effizienz können Sie einen Perl-Einzeiler verwenden. Ich kenne Perl nicht so gut, also würde ich es in Python machen:

#!/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 zählen wollten:

#!/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
Mike DeSimone
quelle
+1 für den nützlichen Vorschlag. Ich war mir dessen bewusst, sortaber nicht uniq, und es scheint, dass letzterer einen -cParameter verwendet, der die Anzahl der Vorkommen für jede Zeile voranstellt. Ich hoffe immer noch auf einen effizienteren (und skalierbareren) Weg, aber das macht den Trick zur Not.
Quinn Taylor
2
Übrigens, wenn Sie XPath zur Hand haben, werden bei der Abfrage //author/text()nur die Autorennamen svn log --xmlzuverlässig entfernt. (Mac OS X hat einen xpathBefehl, der diese Aufgabe fast erledigt, aber überflüssigen Text erzeugt und nicht konfiguriert werden kann. Vielleicht gibt es noch etwas anderes.)
Kevin Reid
@ Kevin, du solltest deine eigene Antwort hinzufügen, damit die Leute für dich stimmen können. Ich mag alle Ihre Kommentare, insbesondere den Tipp sort / uniq.
Quinn Taylor
1
Da svn Benutzername Leerzeichen haben könnte, wäre es besser, eine genauere Filterung zu verwendenawk -F " \\\\| " '{print $2}'
kan
2
Tolle Antwort, obwohl ich die letzte der awk's ändern musste, svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -usonst bekam ich nur eine leere Zeile
MJar
51

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

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

Das Ausgabeformat von svn.exe log --quietsieht 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 aus ? { $_ -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)

Teilen durch ' \| ', um einen Datensatz in ein Array umzuwandeln.

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

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

tinkywinky
dispy
lala
po
tinkywinky

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

dispy
lala
po
tinkywinky
Iain Samuel McLean Elder
quelle
1
Das Sort -Uniqueist Groß- und Kleinschreibung, sollten Sie verwenden Sort-Object | Get-Unique –AsStringoder Select-Object -Uniquestattdessen eine Groß- und Kleinschreibung Kontrolle zu bekommen.
Tom Kuijsten
2
Alternativ:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Nathan Moinvaziri
9

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

Dies verwendet Windows "sort", das möglicherweise nicht auf allen Computern vorhanden ist.

Adam Rofer
quelle
Ich habe auch eine Batch-Datei erstellt, die einen Ordner durchläuft und eine eindeutige Liste aller Repositorys erstellt: pastebin.com/CXiqLddp
Adam Rofer
4

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

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq
lvthillo
quelle
Ich habe diesen Befehl erst gefunden, als ich ihn selbst herausgefunden habe ... Wenn Sie nur die Benutzer eines Remote-Repositorys dazu bringen möchten, ihn zB in git zu konvertieren (siehe git svn --help), ist dies als Checkout nur nützlich, um diesen Befehl auszuführen kann viel zu viel Zeit in Anspruch nehmen.
Seyfahni
2
svn log  path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt

Dieser Befehl hat den Zusatz grep '|', der falsche Werte eliminiert. Andernfalls werden zufällige Festschreibungen beginnend mit 'r'get eingeschlossen und somit Wörter aus Festschreibungsnachrichten zurückgegeben.

Kurbelpartei
quelle
Deshalb wird das Argument --quietoder -qin den anderen Vorschlägen verwendet. Dies druckt nur die Protokoll-Header (Revision, Autor und Datum, Uhrzeit)
v01pe
0

Powershell unterstützt XML, sodass keine Parsing-String-Ausgabe mehr analysiert werden muss.

Hier ist ein kurzes Skript, das ich auf einem Mac verwendet habe, um eine eindeutige Liste von Benutzern über mehrere Repositorys hinweg 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
Jason C.
quelle
0

Eine Lösung für Windows 10.

  1. Erstellen Sie eine Batch-Datei printAllAuthor.bat
@echo off
for /f "tokens=3" %%a in ('svn log --quiet ^|findstr /r "^r"') do echo %%a
@echo on
  1. Führen Sie die Bat-Datei mit dem sortBefehl aus
printAllAuthor.bat | sort /unique >author.txt

PS:

  • In Schritt 2 muss die Batchdatei mit dem richtigen Pfad ausgeführt werden. Legen Sie den Pfad entweder in% PATH% fest oder verwenden Sie das richtige Betriebssystempfadformat.
  • Der Schritt 2 kann je nach Bedarf auch in eine Batch-Datei umgewandelt werden.
Caoglish
quelle
-2

Eine einfachere Alternative:

find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n
Venki
quelle
Dies würde nur CPP-Dateien betrachten, die zum Zeitpunkt der Ausführung im Dateisystem vorhanden sind.
Echristopherson