Як отримати список усіх імен авторів комітетів Subversion?


83

Я шукаю ефективний спосіб отримати список унікальних авторів комітів для сховища 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команди менш корисні, але при необхідності я можу попросити спеціальної послуги адміністратора сховища, якщо це суворо необхідно або набагато ефективніше. У сховищах, з якими я працюю, є десятки тисяч комітів і багато активних користувачів, і я не хочу нікому завдавати незручностей.


6
Subversion не індексує імена авторів (вони просто властивість редакції), тому неможливо це зробити без сканування всього журналу; рішення залежатимуть лише від вартості за комісію.
Кевін Рід

Відповіді:


94

Для того, щоб відфільтрувати дублікати, візьміть вихід і через трубу: sort | uniq. Отже:

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

Я не був би здивований, якщо це спосіб зробити те, що ви просите. Інструменти Unix часто очікують, що користувач виконає вигадливу обробку та аналіз за допомогою інших інструментів.

PS Подумавши, ви можете об'єднати grepі awk...

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

PPS на Кевіна Рід ...

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

P 3 .S. Для кожного, використовуючи вертикальні смуги замість пробілів як роздільники полів, щоб правильно обробляти імена з пробілами (також оновлені приклади 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

+1 за корисну пропозицію. Мені було відомо, sortале ні uniq, і, схоже, останній бере -cпараметр, ніж попереджує кількість випадків для кожного рядка. Я все ще сподіваюся на більш ефективний (і масштабований) спосіб, але це робить фокус у найменшій мірі.
Quinn Taylor

2
До речі, якщо у вас є XPath під рукою, тоді запит //author/text()отримає лише надійні імена авторів svn log --xml. (Mac OS X має xpathкоманду, яка майже виконує цю роботу, але створює сторонній текст і не може бути налаштована на неможливість. Можливо, є щось інше.)
Кевін Рід,

@Kevin, ти повинен додати власну відповідь, щоб люди могли проголосувати за тебе. Мені подобаються всі ваші коментарі, особливо підказка sort / uniq.
Quinn Taylor

1
Оскільки ім'я користувача svn може мати пробіли, було б краще використовувати більш точну фільтраціюawk -F " \\\\| " '{print $2}'
кан.

2
чудова відповідь, хоча мені довелося змінити останній з awk, щоб svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -uінакше я просто отримував порожній рядок
MJar

51

У 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

1
Це Sort -Uniqueне враховує регістр, ви повинні використовувати Sort-Object | Get-Unique –AsStringабо Select-Object -Uniqueзамість цього, щоб отримати перевірку з урахуванням регістру.
Tom Kuijsten

2
Як варіант:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Натан Мойнвазірі

9

Мені довелося зробити це в 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

Тут використовується вікно "сортування", яке може бути присутнім не на всіх машинах.


Я також створив пакетний файл, який переглядає папку та складає унікальний список усіх сховищ: pastebin.com/CXiqLddp
Адам Рофер,

4

Одне віддалене сховище, яке ви можете використовувати:

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

Я не знайшов цієї команди, поки не зрозумів її сам ... Якщо ви просто хочете, щоб користувачі віддаленого сховища, наприклад, перетворили її на git (див. git svn --help), Це дійсно корисно як перевірка лише для виконання цієї команди може зайняти занадто багато часу.
сейфахні

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

Ця команда має додаткову, grep '|'яка виключає помилкові значення. В іншому випадку випадкові коміти, що починаються з 'r'включення, і, таким чином, слова з повідомлень комітів повертаються.


ось чому аргумент --quietабо -qвикористовується в інших пропозиціях. Тут друкуються лише заголовки журналів (редакція, автор та дата, час)
v01pe

0

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

0

Рішення для Windows 10.

  1. створити пакетний файл printAllAuthor.bat
@echo off
for /f "tokens=3" %%a in ('svn log --quiet ^|findstr /r "^r"') do echo %%a
@echo on
  1. запустити файл bat з sortкомандою
printAllAuthor.bat | sort /unique >author.txt

PS:

  • На кроці 2 потрібно запустити пакетний файл із правильним шляхом. або встановіть шлях у% PATH%, або використовуйте правильний формат шляху до ОС.
  • Крок 2 також можна перетворити на пакетний файл відповідно до ваших потреб.

-2

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

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

Це буде розглядати лише файли cpp, які існують у файловій системі на момент запуску.
echristopherson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.