我有一个 Git 代码库,想要计算某个时间段内某个人或一组人添加/修改的代码行数。在 Git 中可以进行这种计算吗?
我有一个 Git 代码库,想要计算某个时间段内某个人或一组人添加/修改的代码行数。在 Git 中可以进行这种计算吗?
你可以使用 git log
和一些 shell 命令:
git log --shortstat --author "Aviv Ben-Yosef" --since "2 weeks ago" --until "1 week ago" \
| grep "files\? changed" \
| awk '{files+=$1; inserted+=$4; deleted+=$6} END \
{print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'
解释: git log --shortstat
显示每个提交的简短统计信息,其中包括更改的文件数、插入和删除的行数等。然后我们可以根据特定的提交者 (--author "Your Name"
) 和时间范围 (--since "2 weeks ago" --until "1 week ago"
) 进行过滤。
现在,为了实际上汇总这些统计数据而不是只看到每次提交的条目,我们需要进行一些 shell 脚本处理。首先,我们使用 grep
过滤仅包含差异行的行。 这些行看起来像这样:
8 files changed, 169 insertions(+), 81 deletions(-)
或者这样:
1 file changed, 4 insertions(+), 4 deletions(-)
然后我们使用awk
对它们求和:对于每一行,我们将更改的文件数(第一个单词),插入的行数(第四个单词)和删除的行数(第六个单词)相加,然后在全部求和后将它们打印出来。
编辑:在顶部的代码段中添加了正斜杠,以便可以将其复制并粘贴到命令行中。
你可以使用Gitstats来生成统计数据。其中有一个"作者"部分,包括前20位提交次数最多的作者添加/删除的行数。
编辑:还有一个Git: Blame Statistics
执行以下命令:
git log --pretty=format:'' --numstat --author 'Lu4' | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}';
--numstat
而不是--shortstat
。与--shortstat
不同,--numstat
包括这些提交的插入和删除操作。gitstats
的文件,并输入以下内容:#!/usr/bin/env bash
git log --pretty=format:'' --numstat "$@" | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}';
然后您可以使用任何额外选项运行该命令到git log
。以下是一些示例:
./gitstats;
./gitstats --since '1 month ago';
./gitstats --since '1 month ago' --until '1 day ago';
./gitstats --author 'Lu4' --since '1 month ago' --until '1 day ago';
gitstats
以外的其他名称。对于特定日期,您可以使用--since "2012-08-27" --until "2012-09-01"
例如:
git log --shortstat --author "Fabian" --since "2012-08-27" --until "2012-09-01" | grep "files changed" | awk '{files+=$1; inserted+=$4; deleted+=$6} END {print "文件更改数:", files, "插入行数:", inserted, "删除行数:", deleted}'
查看此解释:
nano contribution.sh
2) 填充:
if [ $# -eq 1 ]
then
git log --author=$1 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - > logs.txt
cat logs.txt
else
echo "ERROR: you should pass username at argument"
fi
3) 运行:
chmod +x contribution.sh
4) 现在您可以通过以下方式查看您的贡献:
./contribution.sh your_git_username
你可以尝试使用Atlassian's Fisheye/Crucible,它与Git(以及其他代码仓库)集成。然后每个人的贡献,包括他们的LOC,都会在一个易于阅读的Web应用程序中公开显示。对于小团队来说,这也相当便宜。
开源信息,让它自己说话。
$ npm install -g whodid
$ cd your-proj-dir
然后
$ whodid --include-merge=false --since=1.week
#!/bin/env zsh
team_total=$(git shortlog -s -n |sed 's/\t/,/g'|cut -f1 -d, |bc -l|awk '{sum+=$1}END{print sum}');
tmp_counter='/tmp/counter.txt';
tmp_user='/tmp/users.txt';
tmp_percentage='/tmp/counters_users'
# if you are running this again it make the file empty or you can rm it
rm $tmp_percentage $tmp_user $tmp_counter
git shortlog -s -n |sed 's/\t/,/g'|cut -f2 -d, >>$tmp_user;
git shortlog -s -n |sed 's/\t/,/g'|cut -f1 -d, >>$tmp_counter;
cat $tmp_counter | while read LINE; do
printf '%.2f %% \n' $(echo \($LINE/$team_total\)\*100 |bc -l ) >>$tmp_percentage
done
echo 'commits % | contributor | # of commits';paste $tmp_percentage $tmp_user $tmp_counter