Git: How to estimate a contribution of a person to my project in terms of added/changed lines of code?

后端 未结 8 1629
醉梦人生
醉梦人生 2020-12-04 07:42

I have a GIT repository and I want to calculate how many lines of code were added/changed by one person or a group of persons during some period of time. Is it possible to c

相关标签:
8条回答
  • 2020-12-04 08:21

    You can use git log and some 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}'
    

    Explanation: git log --shortstat displays a short statistic about each commit, which, among other things, shows the number of changed files, inserted and deleted lines. We can then filter it for a specific committer (--author "Your Name") and a time range (--since "2 weeks ago" --until "1 week ago").

    Now, in order to actually sum up the stats instead of seeing the entry per commit, we do some shell scripting to do it. First, we use grep to filter only the lines with the diffs. These lines look like this:

     8 files changed, 169 insertions(+), 81 deletions(-)
    

    or this:

     1 file changed, 4 insertions(+), 4 deletions(-)
    

    We then sum these using awk: for each line we add the files changed (1st word), inserted lines (4th word) and deleted lines (6th word) and then print them after summing it all up.

    Edit: forward slashes were added in the top snippet so it can be copy and pasted into a command line.

    0 讨论(0)
  • 2020-12-04 08:21

    Run this command:

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

    This command is very close to the clever one in abyx's answer, but it also handles the edge case found by Wallace Sidhrée. Sometimes, a commit involves deletions only (i.e., no insertions). The command in abyx's answer incorrectly reads those deletions as insertions. The command here reads them correctly because it uses --numstat instead of --shortstat. Unlike --shortstat, --numstat includes both the insertions and deletions for those commits.

    Note that both commands include binary files in the file count but exclude the number of lines inserted and deleted inside those binaries.


    Here is another useful trick. Create a file called gitstats with this content:

    #!/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(+)"}';
    

    Then you can run that command with any extra options to git log you want. Here are some examples:

    ./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';
    

    (The file can be named something other than gitstats, of course.)

    0 讨论(0)
  • 2020-12-04 08:21

    you can do that:

    1) Run:

    nano contribution.sh
    

    2) fill :

    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) Run :

    chmod +x contribution.sh
    

    4) Now you can see your contribution with:

    ./contribution.sh your_git_username
    
    0 讨论(0)
  • 2020-12-04 08:25

    For particular dates, you can use --since "2012-08-27" --until "2012-09-01"

    Like

    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 changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

    Check this explanation

    http://gitref.org/inspect/

    0 讨论(0)
  • 2020-12-04 08:30

    I wrote some cli tool for this (https://www.npmjs.com/package/whodid)

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

    and then

    $ whodid --include-merge=false --since=1.week
    
    0 讨论(0)
  • 2020-12-04 08:31

    You can try Atlassian's Fisheye/Crucible which integrates with Git (as well as other code repos). Then everyone's contributions -- including their LOC -- are displayed publicly in an easily readable Web app. For small groups, it's pretty cheap, too.

    Open source the information and let it speak for itself.

    0 讨论(0)
提交回复
热议问题