如何获取所有Subversion提交作者用户名的列表?

时间:2010-03-22 19:07:29

标签: svn metadata unique commit username

我正在寻找一种有效的方法来获取整个SVN存储库或给定资源路径的唯一提交作者列表。我没有能够专门为此找到一个SVN命令(并且不要指望一个),但我希望有一个更好的方法,我到目前为止在终端(在OS X上)尝试过:< / p>

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

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

其中任何一个都会为每行提供一个作者姓名,但它们都需要过滤掉相当多的额外信息。它们也不处理相同作者名称的重复,因此对于很少作者的许多提交,有大量的冗余流过网络。通常我只想看到唯一的作者用户名。 (实际上可能可以方便地推断出每个作者的提交次数,但即使在这些情况下,如果聚合数据的发送也会更好。)

我通常使用仅限客户端访问,因此svnadmin命令不太有用,但如果有必要,我可以在必要时或者更有效率时特别关注存储库管理员。我正在使用的存储库有成千上万的提交和许多活跃的用户,我不想给任何人带来任何不便。

8 个答案:

答案 0 :(得分:83)

要过滤掉重复项,请输出您的输出并通过管道:sort | uniq。因此:

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

如果这是你要求的方式,我不会感到惊讶。 Unix工具通常希望用户使用其他工具进行奇特的处理和分析。

P.S。考虑一下,您可以合并grepawk ...

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

P.P.S。 Per Kevin Reid ......

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

P 3 .S。 Per kan,使用垂直条而不是空格作为字段分隔符,以正确处理带空格的名称(也更新了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 :(得分:41)

在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

答案 2 :(得分:9)

我必须在Windows中执行此操作,因此我使用了Super Sed的Windows端口(http://www.pement.org/sed/) - 并替换了AWK&amp; GREP命令:

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

这使用了可能并非在所有计算机上都存在的窗口“sort”。

答案 3 :(得分:2)

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

此命令具有额外的grep '|',可消除错误值。 否则,将包括以'r'开头的随机提交,从而返回提交消息中的单词。

答案 4 :(得分: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

PS:

  • 第2步需要使用正确的路径运行批处理文件。要么以%PATH%设置路径,要么使用正确的操作系统路径格式。
  • 根据您的需要,也可以将步骤2制成批处理文件。

答案 5 :(得分: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

答案 6 :(得分:0)

一个可以使用的远程存储库:

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

答案 7 :(得分:-2)

更简单的替代方案:

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