如何获得所有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来想一想,你可以合并grep
和awk
…
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