哪些Git提交统计数据很容易提取


90

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

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

有任何想法吗?

Answers:


197

实际上,git已经为此提供了一个命令:

git shortlog

就您而言,听起来您对这种形式感兴趣:

git shortlog -sne

有关--help各种选项,请参见。

您可能也对GitStats项目感兴趣。他们有一些示例,包括Git项目统计信息。从GitStat主页:

以下是当前生成的一些统计信息的列表:

  • 常规统计:文件总数,行数,提交数,作者数。
  • 活动:按一天中的小时,星期几,星期几,一年中的月份,年份和月份以及年份提交。
  • 作者:作者列表(名称,提交(%),首次提交日期,最后提交日期,年龄),月份的作者,年份的作者。
  • 文件:按日期计数的文件,扩展名
  • 行:按日期划分的代码行

1
这正是我想要的。令人惊讶的是,您实际上可以在我的示例中将代码行替换为“ git shortlog -sn”,为这个答案投票
JesperRønn-Jensen09年

13
git shortlog -sn --no-merges从计数中删除“合并提交”。
lbolla 2011年

4
2010年2月:Linus攻击!
naught101

25

首先,您不必 提取任何内容(如在网络提取中一样),因为您可以在本地拥有整个存储库和整个历史记录。我敢肯定,有一些工具可以为您提供统计信息,但是有时候您可以通过命令行来发挥创造力。例如,这(超出我的脑海)将为您提供每个用户的提交次数:

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

您要求的其他统计信息可能需要更多考虑。您可能需要查看可用的工具。谷歌搜索git statisticsGitStats工具的,我没有经验,甚至对使它在Windows上运行所需的知识更少了,但是您可以尝试。


6
git shortlog -s -n(从stackoverflow.com/questions/1828874/...
naught101

4
git shortlog这确实是正确的命令,但是即使没有它,上述复杂的awk命令也可以通过以下方式来抵消:| sort | uniq -c
josch

没错,@ josch。
Michael Krelin-黑客

7

到目前为止,我确定的最好的工具是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

等等


5

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

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

(由于我的Mac上没有gawk,所以使用awk,并在最活跃的提交器顶部进行排序。)它输出如下列表:

 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-提到乌龟让我想到了窗户。但是无论如何,我很高兴您找到了自己的方式。我的片段只是一个例子和一个起点。
Michael Krelin-黑客

2
这一定是sort -rn
hughdbrown 2012年

对我而言,@hughdbrown -n并不需要sort -rn。我使用的是Mac,但是“排序数字”对于我尝试过的示例没有任何影响
JesperRønn-Jensen2012年

和之间有什么区别git shortlog -sn
Pejman

2

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

这里的关键是执行HASH..HASH的能力

在下面,我正在使用从一个分支到HEAD(该分支的末尾)的第一个哈希。

显示分支中的总提交

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

显示每位作者的总提交量

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


2

我已经编写了一个小的Shell脚本来计算合并统计信息(在处理基于功能分支的工作流时很有用)。这是一个小型存储库上的示例输出:

[$]> 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的请求请求系统,我写了github-pr-stats,它提供的数据比git-merge-stats还要多,甚至还有一个插件系统,可让您集成到您自己的公司特定分析中。
熊基亚莫夫'16


1

这是一个简单的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")


0

您可以使用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


################################################################

0

修改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")

0

如果您使用的是github,则PR Count是一个github应用,用于显示贡献统计数据。

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.