哪些 Git 提交统计数据易于拉取

Posted

技术标签:

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

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

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

有什么想法吗?

【问题讨论】:

【参考方案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(来自***.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”

这将包括:

Contributors Commit Activity Code Frequency Participation Punch Card

【讨论】:

【参考方案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://***.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 应用程序,用于显示贡献统计信息。

【讨论】:

以上是关于哪些 Git 提交统计数据易于拉取的主要内容,如果未能解决你的问题,请参考以下文章

Git学习01-提交代码,查看日志,回退,穿梭,撤销Github仓库代码的删除和拉取等

解决Git每次提交拉取代码都需要输入密码的问题

Git 提交代码步骤总结

如何在svn系统中使用git

Git 总结

Git合并分支加redis