首页 > 解决方案 > 如何使用 git shortlog 在单个目录中的多个存储库中汇总用户提交统计信息?

问题描述

我有一个目录,里面有很多 Git repo 子目录,我想积累类似的信息

git shortlog -sne --no-merges

对于其中的所有存储库,按用户的所有总提交对用户进行排序。

例如对于回购 1:

430 Author 1 <author1@email.com>
 20 Author 2 <author2@email.com>

例如对于回购 2:

123 Author 1 <author1@email.com>
 92 Author 2 <author2@email.com>

总结果:

453 Author 1 <author1@email.com>
112 Author 2 <author2@email.com>

是否可以使用 git 内置工具来做到这一点?

我能够离开 repo 文件夹并为单个文件夹运行它:

git -C repoFolder shortlog -sne --no-merges

标签: bashgitshellgit-log

解决方案


cd在循环中进入每个子目录并使用以下方法处理git shortlog输出awk

for d in *; do git -C $d shortlog -ens --no-merges; done |
    awk '{name_email=""; for (i=2; i<=NF; i++) {name_email=name_email " " $i}; count_by_user[name_email]+=$1} END {for (name_email in count_by_user) print count_by_user[name_email], name_email}'

awk脚本解释:

name_email="";

对于每个输入行:从空变量开始name_email

for (i=2; i<=NF; i++) {name_email=name_email " " $i};

加入从 2 空格分隔的所有字段到name_email. 即结合所有姓名+电子邮件字段。

count_by_user[name_email]+=$1

创建一个新的关联数组count_by_user,并在每一行中增加第一个字段的值(默认为 0)(提交计数)。

END {for (name_email in count_by_user) print count_by_user[name_email], name_email}

最后打印结果:遍历count_by_user索引(姓名+电子邮件),打印计算出的计数器,打印姓名+电子邮件。结果未排序打印。可以在非常awk脚本中排序或使用| sort -nr.

使用. gawk_awk


推荐阅读