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

我正在寻找一种有效的方式来获取整个SVN存储库或给定资源path的唯一提交作者列表。 我一直无法find专门为此(而不是期待)的SVN命令,但我希望可能有一个更好的方式,我已经尝试在terminal(在OS X上):

svn log --quiet | grep "^r" | awk '{print $3}' svn log --quiet --xml | grep author | sed -E "s:</?author>::g" 

其中任何一个都会给我一个作者姓名每行,但他们都需要筛选出相当数量的额外信息。 他们也不处理同一个作者姓名的重复,所以对于很less有作者的许多提交,在电线上有大量的冗余。 更多的时候,我只想看到唯一的作者用户名。 (偶尔推断每个作者的提交次数实际上可能是方便的,但是即使在这些情况下,如果汇总的数据被发送而不是更好)。

我通常只使用客户端访问,所以svnadmin命令不太有用,但是如果必要的话,如果确实需要或者更有效的话,我可能会特别要求存储库pipe理员。 我正在使用的知识库有成千上万的提交和许多活跃的用户,我不想给任何人带来不便。

要过滤出重复项,请input您的输出和pipe道: sort | uniq 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,所以我会用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 

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

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

svn.exe log --quiet的输出格式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 '-*' }过滤出水平线的规则 ? { $_ -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) 

' \| '分割 ' \| '把一个logging变成一个数组。

 $ '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] }select第二个元素。

 tinkywinky dispy lala po tinkywinky 

Sort -Unique返回唯一的事件。 这将输出sorting为副作用。

 dispy lala po tinkywinky 

我必须在Windows中执行此操作,所以我使用了Super Sed的Windows端口( http://www.pement.org/sed/ ) – 并replace了AWK和GREP命令:

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

这使用可能不存在于所有机器上的窗口“sorting”。

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

这个命令有额外的grep '|' 消除了错误的价值。 否则,以'r'开始的随机提交被包含,因此提交消息的单词被返回。

一个更简单的select:

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