Git:查找每位作者提交的代码行数

3
针对特定文件,可以查看每行最后一次修改的作者(git blame等)。我想在项目级别上执行此操作,可以通过指定作者名称或贡献到存储库的所有作者的总和来实现。
我知道git blame只显示最后编辑一行的人,所以如果有人添加了一行并且其他人编辑了它,它将仅显示第二个人。这没问题。
请注意,这与此问题(Git:如何估计一个人在我的项目中添加/更改代码行方面的贡献?)不同,因为它涵盖了整个项目的历史记录,我只关心当前状态。
2个回答

11
列出一个版本的所有文件:
git ls-tree -r $revision

逐个针对文件运行 git blame 命令:

git blame --line-porcelain $file

仅打印作者:

grep '^author '

统计每个作者的出现次数,并打印出姓名和次数:

awk '{a[$0]+=1} END{for(i in a){print i,a[i]}}'

将它们合并,以修订版本 HEAD 为例:

git ls-tree -r HEAD | while read a b c d
do
    git blame --line-porcelain $d
done | grep '^author ' | sed -e 's/author //' | awk '{a[$0]+=1} END{for(i in a){print i,a[i]}}'

运行需要一些时间。我尝试了我的存储库,里面有2800多个文件,用了43秒。


2

您可以在存储库上的每个文件上执行 git blame,然后总结每个作者的贡献。以下是如何获取当前状态下每个作者每行代码数量的示例:

for file in $(git ls-files); do git blame -c $file; done | tr '(' ' ' | awk '{print $2, $3}' | sort | uniq -c | sort -k1 -r;

对于我的代码库,它按日期报告了每个作者的多个条目。 - hoodakaushal
1
你可能需要稍微调整 awk 部分。对于我来说,这个命令可以工作是因为作者的名字和姓氏已经被定义了。如果在你的情况下,他们只有其中一个,或者设置了一个电子邮件 (即,没有空间来放置作者的姓名),那么你可能需要改成 awk '{print $2}' - alamoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接