Szukam wydajnego sposobu na uzyskanie listy unikalnych autorów zatwierdzeń dla repozytorium SVN jako całości lub dla danej ścieżki zasobów. Nie udało mi się znaleźć polecenia SVN specjalnie do tego (i nie oczekuję go), ale mam nadzieję, że może być lepszy sposób niż to, co próbowałem do tej pory w Terminalu (na OS X):
svn log --quiet | grep "^r" | awk '{print $3}'
svn log --quiet --xml | grep author | sed -E "s:</?author>::g"
Każde z nich da mi jedno nazwisko autora w każdym wierszu, ale oba wymagają odfiltrowania sporej ilości dodatkowych informacji. Nie obsługują również duplikatów o tym samym nazwisku autora, więc w przypadku wielu zatwierdzeń przez kilku autorów istnieje mnóstwo nadmiarowości przepływającej przez sieć. Częściej niż nie chcę po prostu zobaczyć unikalne nazwy użytkowników autorów. (Właściwie może przydać się okazjonalne wywnioskowanie liczby zatwierdzeń dla każdego autora, ale nawet w takich przypadkach byłoby lepiej, gdyby zamiast tego przesłano zagregowane dane).
Generalnie pracuję z dostępem tylko do klienta, więc svnadmin
polecenia są mniej przydatne, ale w razie potrzeby mógłbym poprosić administratora repozytorium o specjalną przysługę, jeśli jest to konieczne lub znacznie bardziej wydajne. Repozytoria, z którymi pracuję, mają dziesiątki tysięcy zatwierdzeń i wielu aktywnych użytkowników, i nie chcę nikomu przeszkadzać.
Odpowiedzi:
Aby odfiltrować duplikaty, należy przyjąć moc i rurę przez:
sort | uniq
. A zatem:Nie zdziwiłbym się, gdyby to był sposób na zrobienie tego, o co prosisz. Narzędzia uniksowe często wymagają od użytkownika wymyślnego przetwarzania i analizy za pomocą innych narzędzi.
PS Pomyśl o tym, możesz połączyć
grep
iawk
...PPS według Kevina Reida ...
P 3 .S. Per kan, używanie pionowych kresek zamiast spacji jako separatorów pól, aby poprawnie obsługiwać nazwy ze spacjami (zaktualizowano również przykłady w Pythonie) ...
Aby uzyskać większą wydajność, możesz zrobić jedną linijkę Perla. Nie znam Perla za dobrze, więc skończyłbym na zrobieniu tego w Pythonie:
Lub, jeśli chcesz, liczy się:
Wtedy uciekłbyś:
źródło
sort
ale nieuniq
, i wydaje się, że ten ostatni przyjmuje-c
parametr, który poprzedza liczbę wystąpień dla każdego wiersza. Nadal liczę na bardziej wydajny (i skalowalny) sposób, ale to załatwia sprawę w mgnieniu oka.//author/text()
zwrócisvn log --xml
solidnie tylko nazwiska autorów . (Mac OS X maxpath
polecenie, które prawie wykonuje tę pracę, ale generuje obcy tekst i nie można go skonfigurować tak, aby nie robił. Może jest coś innego.)awk -F " \\\\| " '{print $2}'
svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -u
inaczej, po prostu otrzymywałem pustą linięW programie PowerShell ustaw swoją lokalizację na kopię roboczą i użyj tego polecenia.
Format wyjściowy
svn.exe log --quiet
wygląda następująco:Odfiltruj reguły poziome za pomocą
? { $_ -notlike '-*' }
.Podziel według,
' \| '
aby przekształcić rekord w tablicę.Drugim elementem jest nazwa.
Utwórz tablicę z każdej linii i wybierz drugi element za pomocą
% { ($_ -split ' \| ')[1] }
.Zwróć unikalne wystąpienia za pomocą
Sort -Unique
. Sortuje to wyjście jako efekt uboczny.źródło
Sort -Unique
przypadku nie jest rozróżniana wielkość liter, należy użyćSort-Object | Get-Unique –AsString
lubSelect-Object -Unique
zamiast tego, aby sprawdzić wielkość liter.([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Musiałem to zrobić w Windows, więc użyłem portu Windows Super Sed ( http://www.pement.org/sed/ ) - i zastąpiłem polecenia AWK i GREP:
Używa "sortowania" okien, które może nie być obecne na wszystkich komputerach.
źródło
Jedno zdalne repozytorium, którego możesz użyć:
źródło
git svn --help
), jest to naprawdę przydatne jako checkout tylko do wykonania tego polecenia może zająć zbyt dużo czasu.To polecenie ma dodatkowe,
grep '|'
które eliminują fałszywe wartości. W przeciwnym razie, losowe zatwierdzenia zaczynające się od'r'
get włączone, a tym samym zwracane są słowa z komunikatów o zatwierdzeniach.źródło
--quiet
lub-q
jest używany w innych sugestiach. Spowoduje to wydrukowanie tylko nagłówków dziennika (wersja, autor i data, godzina)Rozwiązanie dla Windows 10.
printAllAuthor.bat
sort
poleceniaPS:
źródło
PowerShell obsługuje XML, co eliminuje potrzebę analizowania wyjściowego ciągu znaków.
Oto krótki skrypt, którego użyłem na komputerze Mac, aby uzyskać unikalną listę użytkowników w wielu repozytoriach.
#!/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
źródło
Prostsza alternatywa:
źródło