Git:如何通过新增/更改的代码行数来评估某个人对我的项目做出的贡献?

49

我有一个 Git 代码库,想要计算某个时间段内某个人或一组人添加/修改的代码行数。在 Git 中可以进行这种计算吗?


4
顺便提醒一下,不要使用这个来估算“性能”,参见http://blogs.msdn.com/b/oldnewthing/archive/2010/11/16/10091537.aspx。 - ismail
2
谢谢您的评论,我并没有打算用这种方式来衡量一个人的薪水。这是为了全面了解一个人的工作情况,而且没有人会知道我正在这样做。 - Lu4
6
重点不在于线条的大小,而在于你如何使用它们。 - ingyhere
3
这个指标存在的问题之一是,有时开发人员会向项目中提交他们没有编写的大型文件,这会导致似乎他们编写了很多行代码。 - ykay says Reinstate Monica
8个回答

85

你可以使用 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对它们求和:对于每一行,我们将更改的文件数(第一个单词),插入的行数(第四个单词)和删除的行数(第六个单词)相加,然后在全部求和后将它们打印出来。

编辑:在顶部的代码段中添加了正斜杠,以便可以将其复制并粘贴到命令行中。


1
我认为你需要在--author和--since以及--until之间加上'='号。 - Dominic Bou-Samra
谢谢!我稍微修改了一下并将其制作成一个 shell 函数。这里可以找到它:https://gist.github.com/pstadler/4722416 - pstadler
5
只要有插入,这个方法就很好用。但如果只有删除,它们会被视为插入,因为“8个文件已更改,81个删除”中的第四个单词是删除而不是插入。 - Wallace Sidhrée
注意:如果您的git配置语言不是英语,则此操作无法正常运行。 - Nicolas Martinez
awk在Windows中不可用。请分享Windows解决方案。 - Farhan Ghumra

18

你可以使用Gitstats来生成统计数据。其中有一个"作者"部分,包括前20位提交次数最多的作者添加/删除的行数。

编辑:还有一个Git: Blame Statistics


2
你能分享一下基本用法是什么样子的吗? - Frederick Nord

7

执行以下命令:

git log --pretty=format:'' --numstat --author 'Lu4' | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}';

这个命令跟abyx的答案中的聪明命令非常相似,但它还处理了Wallace Sidhrée发现的边缘情况。有时,提交只涉及删除(即没有插入)。abyx的答案中的命令错误地将这些删除视为插入。这里的命令正确地读取它们,因为它使用--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以外的其他名称。

3

对于特定日期,您可以使用--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}'

查看此解释:

http://gitref.org/inspect/


2
你可以这样做:

1)运行:
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

1

你可以尝试使用Atlassian's Fisheye/Crucible,它与Git(以及其他代码仓库)集成。然后每个人的贡献,包括他们的LOC,都会在一个易于阅读的Web应用程序中公开显示。对于小团队来说,这也相当便宜。

开源信息,让它自己说话。


很遗憾,Fisheye目前不支持GIT或Mercurial存储库的LOC指标。这些统计数据似乎只支持SVN。https://confluence.atlassian.com/display/FISHEYE/Cannot+View+Lines+of+Code+Information+in+FishEye - Gaylord Zach
哎呀!我改正了。我对Atlassian的信心也有点动摇了。 - ingyhere
最新版本的Fisheye现在支持Git! - ingyhere

1
我为此编写了一些命令行工具(https://www.npmjs.com/package/whodid)。
$ npm install -g whodid
$ cd your-proj-dir

然后

$ whodid --include-merge=false --since=1.week

1
我不确定代码行数是否是一个好的指标,但如果你只是想查看总提交次数并将其与其他工程师进行比较,那么你可以使用以下方法: 无需插件或附加组件...只需纯shell脚本,已在zshell中进行了测试。
注意:您必须从存储库文件夹中运行此命令。
#!/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

这是一个样例报告:

enter image description here


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