代码之家  ›  专栏  ›  技术社区  ›  Quinn Taylor

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

  •  64
  • Quinn Taylor  · 技术社区  · 14 年前

    我正在寻找一种有效的方法来获取整个SVN存储库或给定资源路径的唯一提交作者列表。我还没有找到专门针对这一点的SVN命令(不要期望有这样的命令),但我希望有一种更好的方法,我迄今为止在终端(在OS X上)所做的尝试:

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

    这两种方法中的任何一种都会给我每行一个作者的名字,但是它们都需要过滤掉大量的额外信息。他们也不处理同一作者名的副本,所以对于少数作者的大量提交,有大量的冗余信息在网上流动。通常我只想看到唯一的作者用户名。(事实上 可以 有时可以很方便地推断每个作者的提交计数,但即使在这些情况下,如果将聚合数据发送到不同的位置,情况也会更好。)

    我通常只使用客户端访问,所以 svnadmin 命令不太有用,但是如果必要的话,如果严格必要或者更有效的话,我可以向存储库管理员请求一个特别的帮助。我正在使用的存储库有数万个提交和许多活动用户,我不想给任何人带来不便。

    7 回复  |  直到 6 年前
        1
  •  78
  •   Mike DeSimone    9 年前

    要筛选出重复项,请获取输出并通过管道: sort | uniq . 因此:

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

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

    P.S.想想看,你可以把 grep awk

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

    P.P.S.Per Kevin Reid…

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

    .s.per-kan,使用垂直条而不是空格作为字段分隔符,以正确地处理带有空格的名称(还更新了python示例)…

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

    为了提高效率,您可以使用PerlOne行程序。我对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
    
        2
  •  41
  •   Iain Samuel McLean Elder    11 年前

    在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
    
        3
  •  9
  •   Adam Rofer    14 年前

    我必须在Windows中这样做,所以我使用了超级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“排序”。

        4
  •  2
  •   Deepak Ingole    11 年前
    svn log  path-to-repo | grep '^r' | grep '|' | awk '{print $3}' | sort | uniq > committers.txt
    

    此命令具有 grep '|' 这样就消除了错误的值。 否则,随机提交从 'r' 得到包含,从而返回来自提交消息的单词。

        5
  •  0
  •   Jason C    6 年前

    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
  •   lvthillo    6 年前

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

     svn log --quiet https://url/svn/project/ | grep "^r" | awk '{print $3}' | sort | uniq
    
        7
  •  -2
  •   Venki    10 年前

    更简单的选择:

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