Skip to content

Instantly share code, notes, and snippets.

@xeoncross
Created November 5, 2012 21:35
Show Gist options
  • Star 69 You must be signed in to star a gist
  • Fork 18 You must be signed in to fork a gist
  • Save xeoncross/4020489 to your computer and use it in GitHub Desktop.
Save xeoncross/4020489 to your computer and use it in GitHub Desktop.
Git - calculate how many lines of code were added/changed by someone
# Run this in the project repo from the command-line
# http://stackoverflow.com/a/4593065/99923
git log --shortstat --author "Xeoncross" --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}'
@neuged
Copy link

neuged commented Dec 9, 2021

To address @lack3r 's valid concerns, you can insert '0 insertions ', e.g.: sed 's/changed, \([0-9]\+ deletions\)/changed, 0 insertions(+), \1/g'.

Together with @kirhgoff 's modified grep, this gives us:

git log --shortstat --author "user"  \
    | egrep "file[s] changed" \
    | sed 's/changed, \([0-9]\+ deletions\)/changed, 0 insertions(+), \1/g' \
    | awk '{files+=$1; inserted+=$4; deleted+=$6} END {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

@xresch
Copy link

xresch commented Feb 16, 2022

@neuged: Changes to your command:

  • Added missing asterisk to egrep
  • added since and until parameters
git log --shortstat --author "username"  --since "5 days ago" --until "today" \
    | egrep "file[s]* changed" \
    | sed 's/changed, \([0-9]\+ deletions\)/changed, 0 insertions(+), \1/g' \
    | awk '{files+=$1; inserted+=$4; deleted+=$6} END {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}'

@RobinBastiaan
Copy link

How do I make an alias of this? Because we use both ' and ", I do not know a syntax to get a valid command. This is what I have now:

git config --global alias.my-contribution "!git log ..."

@fedemengo
Copy link

building on the previous solutions, if you want to skip certain files you can add -- ':!pattern'

git log --stat 0000000..HEAD -- ':!*test.go' | rg "files changed" | awk ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment