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

Я ищу эффективный способ получить список уникальных авторов фиксации для репозитория 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

П. П. С. В Кевин Рид...

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

один удаленный репозиторий, вы можете использовать:

 svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print }' | sort | uniq

более простой вариант:

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