Как получить список всех авторских имен пользователей Subversion?

Я ищу эффективный способ получить список уникальных авторов фиксации для репозитория SVN в целом или для определенного пути к ресурсам. Я не смог найти команду SVN специально для этого (и не ожидаю этого), но я надеюсь, что может быть лучший способ, что я уже пробовал в Terminal (в OS X):

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

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

Любой из них даст мне одно имя автора в строке, но они оба требуют отфильтровать достаточное количество дополнительной информации. Они также не обрабатывают дубликаты одного и того же имени автора, поэтому для множества коммитов несколькими авторами существует тонна избыточности, протекающей по проводу. Чаще всего я просто хочу видеть уникальные авторские имена пользователей. (На самом деле может быть полезно указать количество сбоев для каждого автора, но даже в этих случаях было бы лучше, если бы агрегированные данные были отправлены вместо них.)

Я обычно работаю с доступом только для клиентов, поэтому команды svnadmin менее полезны, но при необходимости я могу попросить особую поддержку администратора репозитория, если он строго необходим или намного эффективнее. У репозиториев, с которыми я работаю, есть десятки тысяч коммитов и много активных пользователей, и я не хочу неудобства никому.

Ответ 1

Чтобы отфильтровать дубликаты, выполните выходные и выходные данные через: sort | uniq. Таким образом:

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

Я не удивлюсь, если это способ сделать то, что вы просите. Инструменты Unix часто ожидают, что пользователь сможет прибегнуть к обработке и анализу с помощью других инструментов.

P.S. Подумайте об этом, вы можете объединить grep и awk...

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

P.P.S. Пер Кевин Рид...

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

Р 3.S. Per kan, используя вертикальные столбцы вместо пространств в качестве разделителей полей, правильно обрабатывать имена с пробелами (также обновлял примеры Python)...

svn log --quiet | awk -F ' \\\\|' '/^r/ {print $2}' | 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

Ответ 2

В 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

Ответ 3

Мне нужно было сделать это в 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\1$/!P; D" > USERS.txt

Это использует "сортировку" Windows, которая может отсутствовать на всех машинах.

Ответ 4

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

Эта команда имеет дополнительный grep '|', который исключает ложные значения. В противном случае, случайные коммиты, начинающиеся с 'r', включаются и, следовательно, возвращаются слова из сообщений фиксации.

Ответ 5

Простая альтернатива:

find . -name "*cpp" -exec svn log -q {} \;|grep -v "\-\-"|cut -d "|" -f 2|sort|uniq -c|sort -n