以前,我很喜欢TortoiseSvn能够为给定的SVN存储库生成简单的提交统计信息。我想知道Git中有什么可用,并且特别感兴趣:
- 每个用户的提交次数
- 每个用户更改的行数
- 一段时间内的活动(例如,每周的汇总更改)
有任何想法吗?
Answers:
实际上,git已经为此提供了一个命令:
git shortlog
就您而言,听起来您对这种形式感兴趣:
git shortlog -sne
有关--help
各种选项,请参见。
您可能也对GitStats项目感兴趣。他们有一些示例,包括Git项目的统计信息。从GitStat主页:
以下是当前生成的一些统计信息的列表:
git shortlog -sn --no-merges
从计数中删除“合并提交”。
首先,您不必 提取任何内容(如在网络提取中一样),因为您可以在本地拥有整个存储库和整个历史记录。我敢肯定,有一些工具可以为您提供统计信息,但是有时候您可以通过命令行来发挥创造力。例如,这(超出我的脑海)将为您提供每个用户的提交次数:
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
到目前为止,我确定的最好的工具是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
等等
感谢黑客回答了这个问题。但是,我发现这些修改后的版本更适合我的特定用法:
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
sort -rn
。
-n
并不需要sort -rn
。我使用的是Mac,但是“排序数字”对于我尝试过的示例没有任何影响
git shortlog -sn
?
我已经编写了一个小的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
看到这个gitstat项目
这是一个简单的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")
DataHero现在可以轻松提取Github数据并获取统计信息。我们在内部使用它来跟踪每个里程碑的进度。
https://datahero.com/partners/github/
我们如何在内部使用它:https : //datahero.com/blog/2013/08/13/managing-github-projects-with-datahero/
披露:我为DataHero工作
您可以使用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
################################################################
修改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")