Làm cách nào để có được danh sách tất cả tên người dùng của tác giả cam kết Subversion?


83

Tôi đang tìm một cách hiệu quả để có được danh sách các tác giả cam kết duy nhất cho toàn bộ kho lưu trữ SVN hoặc cho một đường dẫn tài nguyên nhất định. Tôi không thể tìm thấy lệnh SVN cụ thể cho việc này (và không mong đợi một lệnh) nhưng tôi hy vọng có thể có một cách tốt hơn những gì tôi đã thử cho đến nay trong Terminal (trên OS X):

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

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

Một trong hai cách này sẽ cung cấp cho tôi một tên tác giả trên mỗi dòng, nhưng cả hai đều yêu cầu lọc ra một lượng thông tin bổ sung hợp lý. Họ cũng không xử lý các bản sao của cùng một tên tác giả, vì vậy đối với rất nhiều cam kết của một vài tác giả, sẽ có hàng tấn dư thừa đang chảy qua dây. Thường xuyên hơn không, tôi chỉ muốn xem tên người dùng của tác giả duy nhất. (Thực sự thể hữu ích khi suy ra số lượng cam kết cho mỗi tác giả, nhưng ngay cả trong những trường hợp này, sẽ tốt hơn nếu dữ liệu tổng hợp được gửi qua.)

Nói chung, tôi đang làm việc với quyền truy cập chỉ dành cho máy khách, vì vậy svnadmincác lệnh ít hữu ích hơn, nhưng nếu cần, tôi có thể yêu cầu quản trị viên kho lưu trữ đặc biệt ưu ái nếu thực sự cần thiết hoặc hiệu quả hơn nhiều. Các kho lưu trữ mà tôi đang làm việc có hàng chục nghìn cam kết và nhiều người dùng đang hoạt động và tôi không muốn làm phiền bất kỳ ai.


6
Subversion không lập chỉ mục tên tác giả (chúng chỉ là một thuộc tính sửa đổi), vì vậy không có cách nào để làm điều đó mà không quét toàn bộ nhật ký; các giải pháp sẽ chỉ thay đổi theo giá mỗi cam kết.
Kevin Reid

Câu trả lời:


94

Để lọc ra các bản sao, lấy đầu ra và ống của bạn thông qua: sort | uniq. Như vậy:

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

Tôi sẽ không ngạc nhiên nếu đây là cách để làm những gì bạn yêu cầu. Các công cụ Unix thường mong đợi người dùng thực hiện các xử lý và phân tích ưa thích với các công cụ khác.

Tái bút: Hãy nghĩ về nó, bạn có thể hợp nhất grepawk...

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

PPS Per Kevin Reid ...

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

P 3 .S. Mỗi kan, sử dụng các thanh dọc thay vì dấu cách làm dấu phân cách trường, để xử lý đúng các tên có dấu cách (cũng được cập nhật các ví dụ Python) ...

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

Để hiệu quả hơn, bạn có thể làm một lớp lót Perl. Tôi không biết Perl rõ lắm, vì vậy tôi muốn làm điều đó bằng 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)

Hoặc, nếu bạn muốn đếm:

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

Sau đó, bạn sẽ chạy:

svn log --quiet | ./authorfilter.py

+1 cho đề xuất hữu ích. Tôi đã biết sortnhưng không uniq, và có vẻ như sau này lấy một -ctham số hơn là thêm trước số lần xuất hiện cho mỗi dòng. Tôi vẫn hy vọng vào một cách hiệu quả hơn (và có thể mở rộng), nhưng điều này thực hiện một cách khó khăn.
Quinn Taylor

2
Nhân tiện, nếu bạn có XPath hữu ích, thì truy vấn //author/text()sẽ chỉ lấy tên tác giả svn log --xmlmột cách mạnh mẽ. (Mac OS X có một xpathlệnh mà hầu hết làm công việc này, nhưng tạo ra văn bản không liên quan và không thể được cấu hình không Có thể có cái gì khác..)
Kevin Reid

@Kevin, bạn nên thêm câu trả lời của riêng mình để mọi người có thể bình chọn cho bạn. Tôi thích tất cả các bình luận của bạn, đặc biệt là mẹo sắp xếp / uniq.
Quinn Taylor

1
Vì tên người dùng svn có thể có khoảng trắng, nên tốt hơn là sử dụng bộ lọc chính xác hơnawk -F " \\\\| " '{print $2}'
kan

2
Câu trả lời rất lớn, mặc dù tôi đã phải thay đổi người cuối cùng của awk để svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -unếu không tôi đã chỉ nhận được dòng trống
MJar

51

Trong PowerShell, đặt vị trí của bạn thành bản sao hoạt động và sử dụng lệnh này.

svn.exe log --quiet |
? { $_ -notlike '-*' } |
% { ($_ -split ' \| ')[1] } |
Sort -Unique

Định dạng đầu ra của có dạng svn.exe log --quietnhư sau:

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)

Lọc ra các quy tắc ngang với ? { $_ -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)

Chia theo ' \| 'để biến một bản ghi thành một mảng.

$ '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)

Yếu tố thứ hai là tên.

Tạo một mảng của mỗi dòng và chọn phần tử thứ hai với % { ($_ -split ' \| ')[1] }.

tinkywinky
dispy
lala
po
tinkywinky

Trả lại các lần xuất hiện duy nhất với Sort -Unique. Điều này sắp xếp đầu ra như một hiệu ứng phụ.

dispy
lala
po
tinkywinky

1
Các Sort -Uniquelà trường hợp nhạy cảm, bạn nên sử dụng Sort-Object | Get-Unique –AsStringhoặc Select-Object -Uniquethay thế để nhận một trường hợp kiểm tra nhạy cảm.
Tom Kuijsten

2
Ngoài ra:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Nathan Moinvaziri,

9

Tôi phải thực hiện việc này trong Windows, vì vậy tôi đã sử dụng cổng Windows của Super Sed ( http://www.pement.org/sed/ ) - và thay thế các lệnh AWK & GREP:

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

Điều này sử dụng "sắp xếp" cửa sổ có thể không có trên tất cả các máy.


Tôi cũng đã thực hiện một tập tin batch để lặp qua một thư mục và biên dịch một danh sách duy nhất của tất cả các kho: pastebin.com/CXiqLddp
Adam Rofer

4

Một kho lưu trữ từ xa bạn có thể sử dụng:

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

Tôi đã không tìm thấy lệnh này cho đến khi tôi tự mình tìm ra nó ... Nếu bạn chỉ muốn yêu cầu người dùng của một kho lưu trữ từ xa, ví dụ: chuyển đổi nó thành git (xem git svn --help), điều này thực sự hữu ích như một thanh toán chỉ để thực hiện lệnh này có thể mất quá nhiều thời gian.
seyfahni

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

Lệnh này có phần bổ sung grep '|'giúp loại bỏ các giá trị sai. Nếu không, các cam kết ngẫu nhiên bắt đầu bằng 'r'nhận được bao gồm và do đó các từ từ thông báo cam kết được trả về.


đó là lý do tại sao --quiethoặc -qđối số được sử dụng trong các đề xuất khác. Điều này chỉ in tiêu đề nhật ký (bản sửa đổi, tác giả và ngày, giờ)
v01pe

0

Powershell hỗ trợ XML giúp loại bỏ nhu cầu phân tích cú pháp đầu ra chuỗi.

Đây là một tập lệnh nhanh mà tôi đã sử dụng trên máy mac để có được danh sách người dùng duy nhất trên nhiều kho lưu trữ.

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

Một giải pháp cho Windows 10.

  1. tạo một tệp hàng loạt printAllAuthor.bat
@echo off
for /f "tokens=3" %%a in ('svn log --quiet ^|findstr /r "^r"') do echo %%a
@echo on
  1. chạy tệp dơi bằng sortlệnh
printAllAuthor.bat | sort /unique >author.txt

Tái bút:

  • Bước 2 cần chạy tệp loạt với đường dẫn bên phải. đặt đường dẫn trong% PATH% hoặc sử dụng định dạng đường dẫn hệ điều hành phù hợp.
  • Bước 2 có thể được tạo thành một tệp hàng loạt tùy theo nhu cầu của bạn.

-2

Một giải pháp thay thế đơn giản hơn:

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

Điều này sẽ chỉ xem xét các tệp cpp tồn tại trong hệ thống tệp tại thời điểm chạy.
echristopherson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.