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

Qui*_*lor 73 svn metadata commit unique username

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

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

svn log --quiet --xml | grep author | sed -E "s:</?author>::g"
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*one 88

要过滤掉重复项,请将输出和管道通过:sort | uniq.从而:

svn log --quiet | grep "^r" | awk '{print $3}' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

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

PS来想想它,你可以合并grepawk...

svn log --quiet | awk '/^r/ {print $3}' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

PPS Per Kevin Reid ......

svn log --quiet | awk '/^r/ {print $3}' | sort -u
Run Code Online (Sandbox Code Playgroud)

P 3 .S.Per kan,使用垂直条而不是空格作为字段分隔符,以正确处理带空格的名称(也更新了Python示例)......

svn log --quiet | awk -F ' \\\\|' '/^r/ {print $2}' | sort -u
Run Code Online (Sandbox Code Playgroud)

为了提高效率,你可以做一个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)
Run Code Online (Sandbox Code Playgroud)

或者,如果你想要数:

#!/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])
Run Code Online (Sandbox Code Playgroud)

那你就跑了:

svn log --quiet | ./authorfilter.py
Run Code Online (Sandbox Code Playgroud)

  • `sort -u`确实`排序| uniq`在一个命令中. (5认同)
  • 顺便说一下,如果你有方便的XPath,那么查询`// author/text()`将只能得到`svn log --xml`中的作者名称.(Mac OS X有一个`xpath`命令**几乎*完成这项工作,但产生无关的文本,无法配置为.也许还有别的东西.) (2认同)
  • 很好的答案,虽然我不得不将awk的最后一个更改为`svn log --quiet | awk -F'\\\\ | ''/ ^ r/{print $ 3}'| 排序-u`否则我只是变空了 (2认同)

Iai*_*der 43

在PowerShell中,将您的位置设置为工作副本并使用此命令.

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

输出格式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)
Run Code Online (Sandbox Code Playgroud)

过滤掉水平规则? { $_ -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)
Run Code Online (Sandbox Code Playgroud)

拆分' \| '以将记录转换为数组.

$ '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)
Run Code Online (Sandbox Code Playgroud)

第二个元素是名称.

创建每行的数组并选择第二个元素% { ($_ -split ' \| ')[1] }.

tinkywinky
dispy
lala
po
tinkywinky
Run Code Online (Sandbox Code Playgroud)

返回唯一出现次数Sort -Unique.这会将输出排序为副作用.

dispy
lala
po
tinkywinky
Run Code Online (Sandbox Code Playgroud)

  • +1对于我们这些坚持在Windows上的人. (9认同)
  • 或者:`([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | 选择-唯一` (2认同)

小智 9

我不得不这样做在Windows,所以我用超级桑达(的Windows移植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
Run Code Online (Sandbox Code Playgroud)

这使用了可能不存在于所有机器上的窗口"排序".