【问题标题】:Which Git commit stats are easy to pull哪些 Git 提交统计数据易于拉取
【发布时间】:2010-12-01 23:46:25
【问题描述】:

以前我很喜欢 TortoiseSvn 为给定的 SVN 存储库生成简单提交统计信息的能力。我想知道 Git 有什么可用的,我特别感兴趣:

  • 每个用户的提交次数
  • 每个用户更改的行数
  • 一段时间内的活动(例如每周汇总变化)

有什么想法吗?

【问题讨论】:

    标签: git statistics logging code-statistics


    【解决方案1】:

    其实 git 已经有这个命令了:

    git shortlog
    

    在你的情况下,听起来你对这种形式感兴趣:

    git shortlog -sne
    

    有关各种选项,请参阅--help

    您可能还对GitStats project 感兴趣。他们有几个例子,包括stats for the Git project。从 GitStat 主页:

    这是当前生成的一些统计数据的列表:

    • 一般统计数据:文件总数、行数、提交数、作者数。
    • 活动:按一天中的小时、一周中的一天、一周中的小时、一年中的月份、年月和年提交。
    • 作者:作者列表(姓名、提交次数 (%)、首次提交日期、上次提交日期、年龄)、月份作者、年份作者。
    • 文件:按日期计算的文件数、扩展名
    • 行:按日期排列的代码行

    【讨论】:

    • 这正是我想要的。令人惊讶的是,您实际上可以将我示例中的代码行替换为“git shortlog -sn”投票支持此答案
    • git shortlog -sn --no-merges 从计数中删除“合并提交”。
    • 2010 年 2 月:Linus attacks!
    • 作者的代码行数使用基本 git 命令(无需安装 gitstats):git ls-files | while read f; do git blame -w -M -C -C --line-porcelain "$f" | grep -I '^author '; done | sort -f | uniq -ic | sort -n --reverse
    • git shortlog -sne | sort -k2 -rn | nl 用于对输出中的条目进行排名。如果输出太大,则可以附加更少以使其可滚动git shortlog -sne | sort -k2 -rn | nl| less
    【解决方案2】:

    首先,您不必任何东西(如网络拉),因为您在本地拥有整个存储库和整个历史记录。我很确定有一些工具可以为您提供统计信息,但有时您可以通过命令行来发挥创意。例如,这个(我想不到)会给你每个用户的提交次数:

    git log --pretty=format:%ae \
    | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'
    

    您要求的其他统计数据可能需要更多考虑。您可能希望查看可用的工具。谷歌搜索git statistics 指向GitStats 工具,我没有使用该工具的经验,更不知道如何让它在 Windows 上运行,但您可以尝试。

    【讨论】:

    • git shortlog -s -n(来自stackoverflow.com/questions/1828874/…
    • git shortlog 确实是正确的命令,但即使没有它,上面复杂的 awk 命令也可以用 | sort | uniq -c 代替
    【解决方案3】:

    目前我认为最好的工具是 gitinspector。它为每个用户、每周等提供设置报告

    你可以像下面这样使用 npm 安装

    npm install -g gitinspector
    

    获取链接的详细信息如下

    https://www.npmjs.com/package/gitinspector
    https://github.com/ejwa/gitinspector/wiki/Documentation
    https://github.com/ejwa/gitinspector
    

    示例命令是

    gitinspector -lmrTw
    gitinspector --since=1-1-2017
    

    【讨论】:

      【解决方案4】:

      感谢黑客回答这个问题。但是,我发现这些修改后的版本更适合我的特定用途:

      git log --pretty=format:%an \
      | awk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'\
      | sort -r
      

      (使用 awk,因为我的 mac 上没有 gawk,并使用最活跃的提交者在顶部进行排序。) 它输出一个像这样的列表:

       1205 therikss
       1026 lsteinth
        771 kmoes
        720 minielse
        507 pagerbak
        269 anjohans
        205 mfoldbje
        188 nstrandb
        133 pmoller
         58 jronn
         10 madjense
          3 nlindhol
          2 shartvig
          2 THERIKSS
      

      【讨论】:

      • 我不知道你有 Mac - 提到乌龟让我想到了 windows。但无论如何,我很高兴你找到了自己的方式。我的 sn-p 只是一个例子和一个起点。
      • @hughdbrown,对我来说,-nsort -rn 中是不必要的。我使用的是 mac,但“数字排序”对我尝试过的示例没有任何影响
      • 这和git shortlog -sn有什么区别?
      【解决方案5】:

      以下是获取特定分支或两个哈希的统计信息的方法。

      这里的关键是做HASH..HASH的能力

      下面我使用从一个分支到 HEAD 的第一个哈希,它是该分支的结尾。

      显示分支中的提交总数

      • git log FIRST_HASH..HEAD --pretty=oneline | wc -l
      • 输出 53

      显示每位作者的提交总数

      • git shortlog FIRST_HASH..HEAD -sne
      • 输出
      • 24 作者姓名
      • 9 作者姓名

      【讨论】:

        【解决方案6】:

        请注意,如果您的存储库位于 GitHub 上,您现在(2013 年 5 月)拥有一组新的 GitHub API 来获取有趣的统计数据。
        见“File CRUD and repository statistics now available in the API

        这将包括:

        【讨论】:

          【解决方案7】:

          我写了 a small shell script 来计算合并统计信息(在处理基于特征分支的工作流时很有用)。这是一个小型存储库的示例输出:

          [$]> git merge-stats
          % of Total Merges               Author  # of Merges  % of Commits
                      57.14     Daniel Beardsley            4          5.63
                      42.85        James Pearson            3         30.00
          

          【讨论】:

          • 另外,如果你使用 GitHub 的 pull request 系统,我写了github-pr-stats,它提供了比 git-merge-stats 更多的数据,甚至还有一个插件系统可以让你集成到你的自己的公司特定分析。
          【解决方案8】:

          查看这个 gitstat 项目

          http://mirror.celinuxforum.org/gitstat/

          【讨论】:

            【解决方案9】:

            这是一个简单的 ruby​​ 脚本,我用来从 git 获取作者、添加的行、删除的行和提交计数。它不包括随着时间的推移提交。

            请注意,我有一个技巧,它会忽略任何添加/删除超过 10,000 行的提交,因为我认为这是某种代码导入,请随时根据需要修改逻辑。您可以将以下内容放入一个名为 gitstats-simple.rb 的文件中,然后运行

            git log --numstat --pretty='%an' | ruby gitstats-simple.rb
            

            gitstats-simple.rb 的内容

            #!/usr/bin/ruby
            
            # takes the output of this on stdin: git log --numstat --prety='%an'
            
            map = Hash.new{|h,k| h[k] = [0,0,0]}
            who = nil
            memo = nil
            STDIN.read.split("\n").each do |line|
              parts = line.split
              next if parts.size == 0
              if parts[0].match(/[a-z]+/)
                if who && memo[0] + memo[1] < 2000
                  map[who][0] += memo[0]
                  map[who][1] += memo[1]
                  map[who][2] += 1
                end
                who = parts[0]
                memo = [0,0]
                next
              end
              if who
                memo[0]+=line[0].to_i
                memo[1]+=parts[1].to_i
              end
            end
            
            puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")
            

            【讨论】:

              【解决方案10】:

              DataHero 现在可以轻松提取 Github 数据并获取统计信息。 我们在内部使用它来跟踪每个里程碑的进度。

              https://datahero.com/partners/github/

              我们如何在内部使用它:https://datahero.com/blog/2013/08/13/managing-github-projects-with-datahero/

              披露:我为 DataHero 工作

              【讨论】:

                【解决方案11】:

                您可以使用 gitlogged gem (https://github.com/dexcodeinc/gitlogged) 按作者和日期获取活动。这将为您提供如下报告:

                gitlogged 2016-04-25 2016-04-26
                

                返回以下输出

                ################################################################
                
                Date: 2016-04-25
                
                Yunan (4):
                      fix attachment form for IE (#4407)
                      fix (#4406)
                      fix merge & indentation attachment form
                      fix (#4394) unexpected after edit wo
                
                gilang (1):
                      #4404 fix orders cart
                
                
                ################################################################
                ################################################################
                
                Date: 2016-04-26
                
                Armin Primadi (2):
                      Fix document approval logs controller
                      Adding git tool to generate summary on what each devs are doing on a given day for reporting purpose
                
                Budi (1):
                      remove validation user for Invoice Processing feature
                
                Yunan (3):
                      fix attachment in edit mode (#4405) && (#4430)
                      fix label attachment on IE (#4407)
                      fix void method (#4427)
                
                gilang (2):
                      Fix show products list in discussion summary
                      #4437 define CApproved_NR status id in order
                
                
                ################################################################
                

                【讨论】:

                  【解决方案12】:

                  修改https://stackoverflow.com/a/18797915/3243930 .输出非常接近github的图数据。

                  #!/usr/bin/ruby
                  
                  # takes the output of this on stdin: git log --numstat --prety='%an'
                  
                  map = Hash.new{|h,k| h[k] = [0,0,0]}
                  who = nil
                  memo = nil
                  STDIN.read.split("\n").each do |line|
                    parts = line.split("\t")
                    next if parts.size == 0
                    if parts[0].match(/[a-zA-Z]+|[^\u0000-\u007F]+/)
                      if who
                        map[who][0] += memo[0]
                        map[who][1] += memo[1]
                        if memo[0] > 0 || memo[1] > 0 
                          map[who][2] += 1
                        end
                      end
                      who = parts[0]
                      memo = [0,0]
                      next
                    end
                    if who
                      memo[0]+=parts[0].to_i
                      memo[1]+=parts[1].to_i
                    end
                  end
                  
                  puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")
                  

                  【讨论】:

                    【解决方案13】:

                    如果您使用的是 github,PR Count 是一个 github 应用程序,用于显示贡献统计信息。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-02-19
                      • 2015-04-19
                      • 1970-01-01
                      • 2017-04-24
                      相关资源
                      最近更新 更多