Как получить список всех имен пользователей Subversion commit author?
Я ищу эффективный способ получить список уникальных авторов фиксации для репозитория SVN в целом или для заданного пути к ресурсу. Я не смог найти команду SVN специально для этого (и не ожидайте ее), но я надеюсь, что может быть лучший способ, который я пробовал до сих пор в терминале (на OS X):
svn log --quiet | grep "^r" | awk '{print }'
svn log --quiet --xml | grep author | sed -E "s:</?author>::g"
любой из них даст мне одно имя автора в строке, но они оба требуют фильтрации изрядного количества дополнительной информации. Они также не обрабатывайте дубликаты одного и того же имени автора, поэтому для многих коммитов нескольких авторов есть тонны избыточности, протекающей по проводу. Чаще всего я просто хочу видеть уникальные имена пользователей автора. (Это на самом деле может иногда удобно выводить количество фиксаций для каждого автора, но даже в этих случаях было бы лучше, если бы вместо этого были отправлены агрегированные данные.)
Я вообще работаю только с клиентским доступом, так что svnadmin
команды меньше полезно, но при необходимости я мог бы попросить об особой услуге администратора репозитория, если это необходимо или гораздо более эффективно. Репозитории, с которыми я работаю, имеют десятки тысяч коммитов и много активных пользователей, и я не хочу никого беспокоить.
7 ответов:
чтобы отфильтровать дубликаты, возьмите свой выход и трубу через:
sort | uniq
. Таким образом:svn log --quiet | grep "^r" | awk '{print }' | sort | uniq
Я не удивлюсь, если это способ сделать то, что вы просите. Инструменты Unix часто ожидают, что пользователь выполнит причудливую обработку и анализ с помощью других инструментов.
П. С. Если подумать, можно объединить
grep
иawk
...svn log --quiet | awk '/^r/ {print }' | sort | uniq
P. P. S. За Кевина Рида...
svn log --quiet | awk '/^r/ {print }' | sort -u
P3.S. Per kan, используя вертикальные бары вместо пробелов в качестве разделителей полей, чтобы правильно обрабатывать имена с пробелами (также обновлены примеры в Python)...
svn log --quiet | awk -F ' \\|' '/^r/ {print }' | 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
в 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)
второй элемент-это имя.
создайте массив из каждой строки и выберите второй элемент с помощью
% { ($_ -split ' \| ')[1] }
.tinkywinky dispy lala po tinkywinky
возвращает уникальные вхождения с
Sort -Unique
. Это сортирует выход как побочный эффект.dispy lala po tinkywinky
Я должен был сделать это в Windows, поэтому я использовал порт Windows Super Sed ( http://www.pement.org/sed/) - и заменил команды AWK & GREP:
svn log --quiet --xml | sed -n -e "s/<\/\?author>//g" -e "/[<>]/!p" | sort | sed "$!N; /^\(.*\)\n$/!P; D" > USERS.txt
при этом используется windows "сортировка", которая может присутствовать не на всех машинах.
svn log path-to-repo | grep '^r' | grep '|' | awk '{print }' | sort | uniq > committers.txt
эта команда имеет дополнительные
grep '|'
это исключает ложные значения. В противном случае, случайные коммиты начинаются с'r'
получить включены и, таким образом, слова из сообщений фиксации возвращаются.
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