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 svnadmin
Befehle 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.
Antworten:
Um Duplikate herauszufiltern, nehmen Sie Ihre Ausgabe und leiten Sie sie durch :
sort | uniq
. So: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
grep
undawk
...PPS Per Kevin Reid ...
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) ...
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:
Oder wenn Sie zählen wollten:
Dann würden Sie laufen:
quelle
sort
aber nichtuniq
, und es scheint, dass letzterer einen-c
Parameter 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.//author/text()
nur die Autorennamensvn log --xml
zuverlässig entfernt. (Mac OS X hat einenxpath
Befehl, der diese Aufgabe fast erledigt, aber überflüssigen Text erzeugt und nicht konfiguriert werden kann. Vielleicht gibt es noch etwas anderes.)awk -F " \\\\| " '{print $2}'
svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -u
sonst bekam ich nur eine leere ZeileLegen Sie in PowerShell Ihren Speicherort auf die Arbeitskopie fest und verwenden Sie diesen Befehl.
Das Ausgabeformat von
svn.exe log --quiet
sieht folgendermaßen aus:Filtern Sie die horizontalen Regeln mit aus
? { $_ -notlike '-*' }
.Teilen durch
' \| '
, um einen Datensatz in ein Array umzuwandeln.Das zweite Element ist der Name.
Erstellen Sie aus jeder Zeile ein Array und wählen Sie das zweite Element mit aus
% { ($_ -split ' \| ')[1] }
.Geben Sie eindeutige Vorkommen mit zurück
Sort -Unique
. Dies sortiert die Ausgabe als Nebeneffekt.quelle
Sort -Unique
ist Groß- und Kleinschreibung, sollten Sie verwendenSort-Object | Get-Unique –AsString
oderSelect-Object -Unique
stattdessen eine Groß- und Kleinschreibung Kontrolle zu bekommen.([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
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:
Dies verwendet Windows "sort", das möglicherweise nicht auf allen Computern vorhanden ist.
quelle
Ein Remote-Repository, das Sie verwenden können:
quelle
git svn --help
), ist dies als Checkout nur nützlich, um diesen Befehl auszuführen kann viel zu viel Zeit in Anspruch nehmen.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.quelle
--quiet
oder-q
in den anderen Vorschlägen verwendet. Dies druckt nur die Protokoll-Header (Revision, Autor und Datum, Uhrzeit)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
quelle
Eine Lösung für Windows 10.
printAllAuthor.bat
sort
Befehl ausPS:
quelle
Eine einfachere Alternative:
quelle