programing

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

nasanasas 2020. 11. 1. 18:12
반응형

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


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

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

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

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

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


중복을 필터링하려면 출력을 가져와 다음을 통해 파이프하십시오 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

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

I had to do this in Windows, so I used the Windows port of Super Sed ( http://www.pement.org/sed/ ) - and replaced the AWK & GREP commands:

svn log --quiet --xml | sed -n -e "s/<\/\?author>//g" -e "/[<>]/!p" | sort | sed "$!N; /^\(.*\)\n\1$/!P; D" > USERS.txt

This uses windows "sort" that might not be present on all machines.


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

This command has the additional grep '|' that eliminates false values. Otherwise, Random commits starting with 'r' get included and thus words from commit messages get returned.


Powershell has support for XML which eliminates the need for parsing string output.

Here's a quick script I used on a mac to get a unique list of users across multiple repositories.

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

One a remote repository you can use:

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

A simpler alternative:

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

참고URL : https://stackoverflow.com/questions/2494984/how-to-get-a-list-of-all-subversion-commit-author-usernames

반응형