모든 Subversion 커밋 작성자 사용자 이름 목록을 얻는 방법은 무엇입니까?


83

SVN 저장소 전체 또는 지정된 리소스 경로에 대한 고유 한 커밋 작성자 목록을 가져 오는 효율적인 방법을 찾고 있습니다. 나는 이것을 위해 특별히 SVN 명령을 찾을 수 없었지만 (기대하지 마십시오) 지금까지 터미널 (OS X)에서 시도한 것보다 더 나은 방법이 있기를 바랍니다.

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

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

이 중 하나는 한 줄에 하나의 저자 이름을 제공하지만 둘 다 상당한 양의 추가 정보를 필터링해야합니다. 또한 동일한 작성자 이름의 중복을 처리하지 않으므로 소수의 작성자에 의한 많은 커밋의 경우 많은 중복이 와이어를 통해 흐르고 있습니다. 자주 나는 고유 한 작성자 사용자 이름을보고 싶습니다. (실제로 (가) 기회의 각 저자에 대한 카운트를 저지하지만, 집계 데이터가 대신를 통해 전송 된 경우 이러한 경우에도 더 나은 것 추론 편리합니다.)

저는 일반적으로 클라이언트 전용 액세스로 작업하므로 svnadmin명령이 덜 유용하지만 필요한 경우 리포지토리 관리자에게 특별히 필요하거나 훨씬 더 효율적인 경우 특별한 호의를 요청할 수 있습니다. 내가 작업하는 저장소에는 수만 개의 커밋과 많은 활성 사용자가 있으며 누구에게도 불편을 끼치고 싶지 않습니다.


6
Subversion은 작성자 이름을 인덱싱 하지 않으므로 (그저 개정 속성 일뿐입니다) 전체 로그를 스캔하지 않고는 작업을 수행 할 수 없습니다. 솔루션은 커밋 당 비용에 의해서만 달라집니다.
Kevin Reid

답변:


94

중복을 필터링하려면 출력을 가져와 다음을 통해 파이프하십시오 sort | uniq.. 그러므로:

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

이것이 당신이 요청한 것을 수행하는 방법이라면 놀라지 않을 것입니다. Unix 도구는 종종 사용자가 다른 도구로 멋진 처리 및 분석을 수행 할 것으로 기대합니다.

PS 당신이를 병합 할 수 있습니다 그것을 생각 해 보 니, grepawk...

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을 잘 모르기 때문에 파이썬으로 끝낼 것입니다.

#!/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 Reid

@Kevin, 사람들이 투표 할 수 있도록 자신의 답변을 추가해야합니다. 나는 당신의 모든 의견, 특히 sort / uniq 팁을 좋아합니다.
Quinn Taylor

1
svn 사용자 이름에 공백이있을 수 있으므로보다 정확한 필터링을 사용하는 것이 더 좋습니다awk -F " \\\\| " '{print $2}'
kan

2
대단한 대답 이었지만 마지막 awk를 svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -u다른 것으로 변경해야했지만 빈 줄이
생겼

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 2015 년

2
또는 :([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Nathan Moinvaziri

9

Windows에서이 작업을 수행해야했기 때문에 Super Sed ( http://www.pement.org/sed/ ) 의 Windows 포트를 사용 하고 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
Adam Rofer

4

사용할 수있는 원격 저장소 :

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

내가 직접 알아낼 때까지이 명령을 찾지 못했습니다 ... 원격 저장소의 사용자가 예를 들어 git로 변환하도록하고 싶다면 (참조 git svn --help)이 명령을 실행하는 체크 아웃으로 만 유용합니다. 시간이 너무 많이 걸릴 수 있습니다.
seyfahni

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

이 명령에는 grep '|'거짓 값을 제거 하는 추가 기능 이 있습니다. 그렇지 않으면 'r'get 포함으로 시작하는 임의 커밋이 발생하므로 커밋 메시지의 단어가 반환됩니다.


그것이 --quietor -q인수가 다른 제안에서 사용되는 이유 입니다. 로그 헤더 (개정, 작성자 및 날짜, 시간) 만 인쇄합니다
v01pe 2013

1

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. sort명령으로 bat 파일 실행
printAllAuthor.bat | sort /unique >author.txt

추신:

  • 2 단계에서는 올바른 경로로 배치 파일을 실행해야합니다. % PATH %에 경로를 설정하거나 올바른 OS 경로 형식을 사용하십시오.
  • 2 단계는 필요에 따라 배치 파일로도 만들 수 있습니다.

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

-2

더 간단한 대안 :

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

이것은 이것이 실행될 때 파일 시스템에 존재하는 cpp 파일 만 볼 것입니다.
echristopherson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.