之前我很喜欢 TortoiseSvn 的一项功能,它可以为给定的 SVN 存储库生成简单的提交统计数据。我想知道 Git 有哪些类似的功能,尤其是:
- 每个用户的提交次数
- 每个用户更改的行数
- 随时间的活动情况(例如按周聚合的更改量)
你有什么想法吗?
之前我很喜欢 TortoiseSvn 的一项功能,它可以为给定的 SVN 存储库生成简单的提交统计数据。我想知道 Git 有哪些类似的功能,尤其是:
你有什么想法吗?
实际上,Git 已经有一个命令可以做到这一点:
git shortlog
在你的情况下,听起来你对这种形式感兴趣:
git shortlog -sne
参见--help
以获取各种选项。
你可能还对GitStats项目感兴趣。他们有一些示例,包括Git项目的统计信息。从GitStat主页上可以看到:
以下是目前生成的一些统计信息列表:
首先,你不必像网络拉取一样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上运行它需要什么也没有太多的想法,但你可以试试。
git shortlog
是正确的命令,但即使没有它,在上面复杂的awk命令中也可以用| sort | uniq -c
替换。 - josch到目前为止,我发现最好用的工具是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
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
。我使用的是Mac,但“sort numeric”对我尝试过的示例没有任何影响。 - Jesper Rønn-Jensengit shortlog -sn
有什么区别? - Pejman我编写了一个小的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
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")
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
################################################################
git shortlog -sn --no-merges
的作用是从计数中删除“合并提交”。 - lbollagit 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
- hartmutgit 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 scrolllablegit shortlog -sne | sort -k2 -rn | nl| less
- Raheel