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

103

之前我很喜欢 TortoiseSvn 的一项功能,它可以为给定的 SVN 存储库生成简单的提交统计数据。我想知道 Git 有哪些类似的功能,尤其是:

  • 每个用户的提交次数
  • 每个用户更改的行数
  • 随时间的活动情况(例如按周聚合的更改量)

你有什么想法吗?

12个回答

212

实际上,Git 已经有一个命令可以做到这一点:

git shortlog

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

git shortlog -sne

参见--help以获取各种选项。

你可能还对GitStats项目感兴趣。他们有一些示例,包括Git项目的统计信息。从GitStat主页上可以看到:

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

  • 总体统计:文件总数、行数、提交次数、作者人数。
  • 活动:按小时、星期几、每周小时、每年月份、年和月、年提交次数。
  • 作者:作者列表(姓名、提交次数(%)、第一次提交日期、最后提交日期、年龄)、月度作者、年度作者。
  • 文件:按日期、扩展名的文件数量
  • 行数:按日期计算的代码行数

1
这正是我一直在寻找的。真是太神奇了,你竟然可以用“git shortlog -sn”替换我的示例代码行。为此回答点赞。 - Jesper Rønn-Jensen
16
git shortlog -sn --no-merges 的作用是从计数中删除“合并提交”。 - lbolla
5
2010年2月:Linus攻击! - naught101
1
使用基本的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 - hartmut
git shortlog -sne | sort -k2 -rn | nl for ranking the enteries in the output. If output is too big then less can be appended to make it scrolllable git shortlog -sne | sort -k2 -rn | nl| less - Raheel

26

首先,你不必像网络拉取一样pull(拉取)任何东西,因为你已经在本地拥有整个代码库和完整的提交历史记录。我相信有工具可以提供统计信息,但有时你可以通过命令行进行创造性操作。例如,以下命令(随口想出)将给出每个用户的提交次数:

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

你所要求的其他统计数据可能需要更多思考。你可能想查看可用的工具。谷歌搜索 git statistics 会指向GitStats 工具,我没有使用过,并且对在Windows上运行它需要什么也没有太多的想法,但你可以试试。


6
git shortlog -s -n - naught101
4
确实,git shortlog是正确的命令,但即使没有它,在上面复杂的awk命令中也可以用| sort | uniq -c替换。 - josch

10

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

等等


7
感谢黑客回答这个问题。然而,我发现这些修改版更适合我的特定用途:
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 - 一提到乌龟就让我想到了Windows。但无论如何,我很高兴你找到了自己的方法。我的片段只是一个例子和起点。 - Michael Krelin - hacker
@hughdbrown,对我来说,在sort -rn中不需要使用-n。我使用的是Mac,但“sort numeric”对我尝试过的示例没有任何影响。 - Jesper Rønn-Jensen
这和 git shortlog -sn 有什么区别? - Pejman

3

我编写了一个小的shell脚本git-merge-stats,可以计算合并统计数据(在处理基于特性分支的工作流时非常有用)。下面是一个小型仓库的示例输出:

[$]> 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更多的数据,甚至还有插件系统,可以让你集成自己公司特定的分析。 - Xiong Chiamiov

2

2
以下是关于获取特定分支或两个哈希值的统计信息的方法。
关键在于能够执行 HASH..HASH 操作。
下面我将使用一个分支到 HEAD 的第一个哈希值,即该分支的末尾。
显示分支中的总提交次数
git log FIRST_HASH..HEAD --pretty=oneline | wc -l 输出 53
显示每个作者的总提交次数
git shortlog FIRST_HASH..HEAD -sne 输出 24 作者姓名 9 作者姓名

1

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接