获取Git存储库(仍在使用的行中)的贡献的历史统计信息

时间:2016-02-01 01:55:33

标签: git

开发人员进行提交,合并分支,覆盖彼此的代码。他们进来并重构或添加新功能。代码是迭代的。

是否有一个很好的git机制来查找哪个开发人员在当前分支中使用最多的代码?

例如:

  1. 开发人员 X 在文件中创建100行。
  2. 开发人员 Y Z 每个重构50行代码。
  3. 对于100行文件,

    git blame将显示开发人员 Y Z 作为每行50行代码的作者。 根据相同的 blame ,开发人员 X 负责0行代码。

    但是,我们知道 X 写了原始的100行。因此,我想知道每个开发人员的贡献。

    考虑到当前仍在使用的代码行:是否有一个良好的git机制来查找谁在这些行的历史中贡献最多?

1 个答案:

答案 0 :(得分:3)

非常有趣的问题!感谢您的提问 - 偶尔我的团队也需要这些。

我快速找到了你想要的东西:

需要的是作者grep对git blame --line-porcelain的输出。

(for f in `git ls-files`; do git blame --line-porcelain  $f |
   grep 'author '; done) | 
awk '{cnt[$_]++} END {for (x in cnt) print cnt[x],x}' | sort -rn -k1

它不是火箭科学,也不是速度恶魔。它只是使用标准Unix工具对所有存储库文件的git blame输出进行聚合。但它显示了一些整洁的输出..

我检查了数字;聚合计数器的总和等于git ls-files返回的所有文件的行计数器的总和,这是我们所期望的。

Elixir语言的存储库示例:

97037 author José Valim
3151 author Aleksei Magusev
3017 author Alexei Sholik
3003 author James Fish
2837 author Bryan Enders
2677 author Eric Meadows-Jönsson
2667 author eksperimental
1604 author Andrea Leopardi
1109 author Bryan Endersstocker
1073 author Eric Meadows-Jonsson
1058 author Yurii Rashkovskii
901 author Yuki Ito
828 author Rafael Mendonça França
735 author John Warwick
689 author Paulo Almeida
[...]

请注意使用git blame --line-porcelain代替git blame --incremental。后者在与提交相对应的记录中输出信息,而不是单行;所以计算是错误的。

[ EDIT note ]无论是谁查看原始答案,它都包含一个错误,该错误与适当的解决方案一起解释,后来由社区编辑以缩短消息。