Brian Ford: 4410668
Evan Phoenix: 1906343
Ryan Davis: 855674
Shane Becker: 242904
Alexander Kellett: 167600
Eric Hodel: 132986
Dirkjan Bussink: 113756
...
剧本:
#!/usr/bin/env ruby
impact = Hash.new(0)
IO.popen("git log --pretty=format:\"%an\" --shortstat #{ARGV.join(' ')}") do |f|
prev_line = ''
while line = f.gets
changes = /(\d+) insertions.*(\d+) deletions/.match(line)
if changes
impact[prev_line] += changes[1].to_i + changes[2].to_i
end
prev_line = line # Names are on a line of their own, just before the stats
end
end
impact.sort_by { |a,i| -i }.each do |author, impact|
puts "#{author.strip}: #{impact}"
end
with open(r".\logs.txt", "r", encoding="utf8") as f:
files = insertions = deletions = 0
for line in f:
if ' changed' in line:
line = line.strip()
spl = line.split(', ')
if len(spl) > 0:
files += int(spl[0].split(' ')[0])
if len(spl) > 1:
insertions += int(spl[1].split(' ')[0])
if len(spl) > 2:
deletions += int(spl[2].split(' ')[0])
print(str(files).ljust(10) + ' files changed')
print(str(insertions).ljust(10) + ' insertions')
print(str(deletions).ljust(10) + ' deletions')
你的输出将是:
225 files changed
6751 insertions
1379 deletions
162
这个脚本在这里就可以了 . 把它放入authorship.sh,chmod x它,你就完成了 .
#!/bin/sh
declare -A map
while read line; do
if grep "^[a-zA-Z]" <<< "$line" > /dev/null; then
current="$line"
if [ -z "${map[$current]}" ]; then
map[$current]=0
fi
elif grep "^[0-9]" <<<"$line" >/dev/null; then
for i in $(cut -f 1,2 <<< "$line"); do
map[$current]=$((map[$current] + $i))
done
fi
done <<< "$(git log --numstat --pretty="%aN")"
for i in "${!map[@]}"; do
echo -e "$i:${map[$i]}"
done | sort -nr -t ":" -k 2 | column -t -s ":"
21 回答
要计算给定分支上给定作者(或所有作者)的 commits 的数量,您可以使用git-shortlog;特别参见其
--numbered
和--summary
选项,例如在git存储库上运行时:以下命令的输出应该相当容易发送到脚本以添加总计:
这为当前HEAD上的所有提交提供了统计信息 . 如果要在其他分支中添加统计信息,则必须将它们作为参数提供给
git log
.对于传递给脚本,甚至可以使用空日志格式删除"oneline"格式,并且如JakubNarębski所述,
--numstat
是另一种选择 . 它生成每个文件而不是每行统计信息,但更容易解析 .这提供了有关作者的一些统计信息,根据需要进行修改
使用Gawk:
在Mac OSX上使用Awk:
编辑(2017)
github上有一个新包,看起来很光滑,并使用bash作为依赖(在linux上测试) . 它更适合直接使用而不是脚本 .
这是git-quick-stats (github link) .
将
git-quick-stats
复制到文件夹并将该文件夹添加到路径 .用法:
如果有人想在他们的代码库中看到每个用户的统计数据,我的几个同事最近提出了这个可怕的单行:
(花几分钟时间来处理我们的回购,其中有大约10-15k的提交 . )
Git fame https://github.com/oleander/git-fame-rb
是一个很好的工具,可以同时获取所有作者的计数,包括提交和修改的文件数:
https://github.com/casperdcl/git-fame也有Python版本(@fracz提到):
样本输出:
但要注意:正如Jared在评论中所提到的那样,在一个非常大的存储库上进行操作需要几个小时 . 不确定是否可以改进,考虑到它必须处理如此多的Git数据 .
我发现以下内容对于查看当前代码库中包含最多行的人员非常有用:
其他答案主要集中在提交中更改的行,但如果提交无法生存并被覆盖,则可能只是流失 . 上面的咒语也会让你所有提交者按行排序,而不是一次只有一个 . 您可以为git blame(-C -M)添加一些选项,以获得一些更好的数字,以便将文件移动和文件之间的行移动考虑在内,但是如果这样做,命令可能运行的时间会更长 .
此外,如果您正在查找所有提交的所有提交中更改的行,则以下小脚本很有用:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
在看了 Alex's 和 Gerty3000 的答案之后,我试图缩短单线:
基本上,使用git log numstat和 not 跟踪 files 的数量已更改 .
Mac OSX上的Git版本2.1.0:
例:
来自AaronM的Answer使用shell单行是好的,但实际上,还有另一个错误,如果用户名和日期之间有不同数量的空格,空格将破坏用户名 . 损坏的用户名将为用户计数提供多行,您必须自己总结它们 .
这个小改动为我解决了这个问题:
注意after \ s将消耗从名称到日期的所有空格 .
实际上添加这个答案对我自己的记忆和帮助其他人一样多,因为这至少是我第二次谷歌主题:)
这里's a short one-liner that produces stats for all authors. It'比上面的Dan的解决方案快得多https://stackoverflow.com/a/20414465/1102119(我的时间复杂度为O(N)而不是O(NM),其中N是提交数,M是作者数) .
@mmrobins @AaronM @ErikZ @JamesMishra提供的变体都有一个共同的问题:他们要求git生成一个不用于脚本消费的信息混合,包括来自同一行上的存储库的行内容,然后将该混乱与regexp匹配 .
当一些行不是有效的UTF-8文本时,以及当某些行恰好与正则表达式匹配时(这发生在这里),这是一个问题 .
这是一个没有这些问题的修改过的行 . 它要求git在单独的行上干净地输出数据,这样可以很容易地过滤我们想要的内容:
你可以grep其他字符串,如author-mail,committer等 .
也许首先做
export LC_ALL=C
(假设是bash
)来强制进行字节级处理(这也恰好可以从基于UTF-8的语言环境中大大加快grep) .在中间给出了一个带有ruby的解决方案,默认情况下perl稍微更多可用,这是作者使用perl作为当前行的替代方案 .
此外Charles Bailey's answer,您可能希望将
-C
参数添加到命令中 . 否则文件重命名计为大量添加和删除(文件有行数),即使文件内容未被修改 .为了说明,当使用
git log --oneline --shortstat
命令时,这里有a commit,其中一个项目正在移动大量文件:这里使用
git log --oneline --shortstat -C
命令进行相同的提交,该命令检测文件副本并重命名:在我看来,后者提供了一个更真实的视图,了解一个人对项目的影响,因为重命名文件比从头开始编写文件要小得多 .
这是一个快速的ruby脚本,可以根据给定的日志查询来确定每个用户的影响 .
例如,对于rubinius:
剧本:
你可以使用whodid(https://www.npmjs.com/package/whodid)
和
或者只是打字
然后你可以看到这样的结果
我在上面提供了一个简短答案的修改,但它不足以满足我的需求 . 我需要能够在最终代码中对提交的行和行进行分类 . 我也希望按文件分解 . 此代码不会递归,它只会返回单个目录的结果,但如果有人想要更进一步,这是一个良好的开端 . 复制并粘贴到文件中并生成可执行文件或使用Perl运行它 .
这是最好的方法,它还可以让您清楚地了解所有用户提交的总数
使用以下命令将日志保存到文件
对于Python爱好者:
你的输出将是:
这个脚本在这里就可以了 . 把它放入authorship.sh,chmod x它,你就完成了 .
你想要Git blame .
有一个--show-stats选项可以打印一些好的统计数据 .
该问题要求提供有关特定作者的信息,但许多答案都是基于其代码行更改而返回作者排名列表的解决方案 .
这就是我想要的,但现有的解决方案并不完美 . 为了可能通过Google找到这个问题的人的利益,我对它们做了一些改进,并将它们变成了一个shell脚本,我将在下面显示 . 带注释的(我将继续维护)可以是found on my Github .
Perl或Ruby都没有依赖关系 . 此外,行更改计数中会考虑空格,重命名和行移动 . 只需将其放入文件并将您的Git存储库作为第一个参数传递 .
到目前为止我认识的最好的工具是gitinspector . 它为每个用户,每周等提供设置报告 . 您可以使用npm安装如下所示
npm install -g gitinspector
获取更多详细信息的链接
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
示例命令是