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


83

我正在寻找一种有效的方法来获取整个SVN存储库或给定资源路径的唯一提交作者列表。我还没有找到专门用于此的SVN命令(并且不希望有一个),但是我希望有一种更好的方法可以解决到目前为止我在Terminal(在OS X上)尝试过的方法:

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

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

这两种方法每行都会给我一个作者姓名,但是它们都需要过滤掉大量的额外信息。他们也不会处理同一作者姓名的重复副本,因此,对于很少有作者进行的大量提交工作,网络上存在大量冗余。通常,我只是想看到唯一的作者用户名。(实际上,有时候可以推断每个作者的提交计数可能很方便,但是即使在这些情况下,最好还是发送汇总数据来发送。)

我通常使用的是仅客户端访问,因此svnadmin命令的用处较小,但如果有必要,我可能会在绝对必要或效率更高的情况下向存储库管理员提出特别要求。我正在使用的存储库有成千上万的提交和许多活跃的用户,我不想给任何人带来不便。


6
Subversion不会索引作者名称(它们只是一个修订版属性),因此没有扫描整个日志的方法就无法做到。解决方案仅因每次提交的成本而有所不同。
凯文·里德

Answers:


94

要过滤出重复项,请输出并通过以下管道传递: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 Per Kevin Reid ...

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

P 3 .S。使用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是有用的建议。我知道sort但不是知道的uniq,而且似乎后者采用一个-c参数而不是为每行添加出现次数。我仍然希望有一种更有效(和可扩展)的方法,但这确实可以解决问题。
奎因·泰勒

2
顺便说一句,如果您方便使用XPath,则查询//author/text()将仅svn log --xml可靠地获得作者姓名。(Mac OS X的xpath命令几乎可以完成这项工作,但是会产生多余的文本,并且无法配置为不这样做。也许还有其他东西。)
Kevin Reid 2010年

@Kevin,您应该添加自己的答案,以便其他人可以为您投票。我喜欢您的所有评论,尤其是sort / uniq提示。
奎因·泰勒

1
由于svn用户名可以包含空格,因此最好使用更准确的过滤条件awk -F " \\\\| " '{print $2}'
kan

2
很好的答案,尽管我必须将awk的最后一个更改为svn log --quiet | awk -F ' \\\\| ' '/^r/ {print $3}' | sort -u否则,否则我只是空行了
MJar 2013年

51

在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

1
Sort -Unique不区分大小写,您应该使用Sort-Object | Get-Unique –AsStringSelect-Object -Unique以帮助您区分大小写的检查。
Tom Kuijsten

2
或者:([xml](svn log --xml)).SelectNodes('//author') | % {$_.InnerText} | Select -Unique
Nathan Moinvaziri '17

9

我必须在Windows中执行此操作,因此我使用了Super Sed的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

这将使用可能并非在所有计算机上都存在的Windows“排序”窗口。


我还制作了一个批处理文件,该文件可循环访问文件夹并编译所有存储库的唯一列表:pastebin.com/CXiqLddp
Adam Rofer,2010年

4

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

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

直到我自己弄清这个命令,我才找到它。...如果您只想让远程存储库的用户将其转换为git(请参阅参考资料git svn --help),这实际上仅作为执行此命令的结帐非常有用可能会花费太多时间。
seyfahni

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

此命令具有grep '|'消除错误值的附加功能。否则,'r'将包括随机开始的提交,从而返回提交消息中的单词。


这就是为什么在其他建议中使用--quietor-q参数的原因。这只会打印日志标题(修订,作者和日期,时间)
v01pe 2013年

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

0

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%中设置路径或使用正确的OS路径格式。
  • 也可以根据需要将步骤2制成批处理文件。

-2

一个更简单的选择:

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

这只会查看运行时文件系统中存在的cpp文件。
echristopherson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.