【问题标题】:Git: How to estimate a contribution of a person to my project in terms of added/changed lines of code?Git:如何根据添加/更改的代码行来估计一个人对我的项目的贡献?
【发布时间】:2011-06-03 08:00:24
【问题描述】:

我有一个 GIT 存储库,我想计算一个人或一组人在一段时间内添加/更改了多少行代码。可以用git计算吗?

【问题讨论】:

  • 不要使用它来估计“性能”顺便说一句,请参阅blogs.msdn.com/b/oldnewthing/archive/2010/11/16/10091537.aspx
  • 感谢您的评论,我无意用这种衡量标准来衡量一个人的薪水。这样做是为了全面了解人的工作,没有人会知道我正在做一个
  • 这不是线条的大小,而是你如何使用它们。
  • 这种测量的一个问题是,有时开发人员将大文件签入到他们尚未编写的项目中,这使得他们看起来好像已经编写了很多行代码

标签: git


【解决方案1】:

你可以使用git log 和一些shell-fu:

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 个单词)、插入的行(第 4 个单词)和删除的行(第 6 个单词),然后在全部加总后打印它们。

编辑:在顶部 sn-p 中添加了正斜杠,因此可以将其复制并粘贴到命令行中。

【讨论】:

  • 我认为您需要在 --author 和 --since 和 --until 之间添加 '=' 符号
  • 谢谢!我稍微调整了一下,并用它制作了一个 shell 函数。它可以在这里找到:gist.github.com/pstadler/4722416
  • 只要有插入就可以很好地工作。在只有删除的情况下,它们将被视为插入,因为8 files changed, 81 deletions 上的第 4 个单词是删除,而不是插入。
  • 注意:如果你的 git 是用英语以外的其他语言配置的,这将不起作用
  • awk 在 Windows 中不可用。请分享windows解决方案。
【解决方案2】:

您可以使用Gitstats 生成统计信息。它有一个“作者”部分,其中包括前 20 位作者添加/删除的行数(按提交计数排名前 20 位)。

编辑:还有Git: Blame Statistics

【讨论】:

  • 你能分享一下基本用法吗?
【解决方案3】:

运行这个命令:

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

这个命令非常接近abyx's answer 中的聪明命令,但它也处理Wallace Sidhrée 发现的边缘情况。有时,提交只涉及删除(即不插入)。 abyx's answer 中的命令错误地将这些删除读取为插入。此处的命令可以正确读取它们,因为它使用--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 以外的名称。)

【讨论】:

    【解决方案4】:

    对于特定日期,您可以使用 --since "2012-08-27" --until "2012-09-01"

    喜欢

    git log --shortstat --author "Fabian" --since "2012-08-27" --until "2012-09-01" | grep "文件已更改" | awk '{文件+=$1;插入+=$4; 已删除+=$6} END {打印“文件已更改”,文件,“插入的行:”, 已插入,“行已删除:”,已删除}'

    检查这个解释

    http://gitref.org/inspect/

    【讨论】:

      【解决方案5】:

      你可以这样做:

      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
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • fisheye 目前不支持 GIT 或 mercurial 存储库上的 LOC 指标。这些统计信息似乎只支持 SVN。 confluence.atlassian.com/display/FISHEYE/…
        • 哎哟!我站得更正了。我对 Atlassian 的信心也有些动摇了。
        • 最新版本的 Fisheye 现已支持 Git!
        【解决方案7】:

        我为此编写了一些 cli 工具 (https://www.npmjs.com/package/whodid)

        $ npm install -g whodid
        $ cd your-proj-dir
        

        然后

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

        【讨论】:

          【解决方案8】:

          我不确定代码行是否是一个好的指标,但如果您只是在寻找总提交并将其与其他工程师进行比较,那么您可以使用这个: 不需要插件或插件......只是纯shell脚本,它在zshell中测试过

          注意:您必须从 repo 文件夹中运行它

          #!/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
          

          这里是示例报告:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-22
            • 2014-10-16
            • 2017-04-05
            • 2012-11-20
            • 1970-01-01
            • 1970-01-01
            • 2011-05-22
            相关资源
            最近更新 更多