在git中显示每位作者更改的行数

kni*_*ttl 30 git diff logging history

我想看看删除/添加行的数量,按作者分组给git历史中的给定分支.有git shortlog -s一个显示每个作者的提交数量.是否有类似的东西获得整体diffstat?

Seb*_*rin 39

这是一个老帖子,但如果有人还在寻找它:

安装git extras

brew install git-extras
Run Code Online (Sandbox Code Playgroud)

然后

git summary --line
Run Code Online (Sandbox Code Playgroud)

https://github.com/tj/git-extras

  • Linux用户的'apt-get install git-extras` (3认同)
  • `fatal: unrecognized argument: --line` 我认为他们已经删除了最新版本中的选项 (2认同)

Von*_*onC 18

由于SO问题"如何计算Git存储库中特定作者改变的总行数?" 并不完全令人满意,commandlinefu有替代品(尽管不是每个分支):

git ls-files | while read i; do git blame $i | sed -e 's/^[^(]*(//' -e 's/^\([^[:digit:]]*\)[[:space:]]\+[[:digit:]].*/\1/'; done | sort | uniq -ic | sort -nr
Run Code Online (Sandbox Code Playgroud)

它包含二进制文件,这是不好的,所以你可以(删除真正随机的二进制文件):

git ls-files | grep -v "\.\(pdf\|psd\|tif\)$"
Run Code Online (Sandbox Code Playgroud)

(注意:由trcarden 评论,a 或选项不起作用. 从手册页,只会排除未跟踪的内容,如果 或者已添加到命令中.)-x--exclude
git ls-filesgit ls-files -x "*pdf" ...--others--ignoredgit ls-files

要么:

git ls-files "*.py" "*.html" "*.css" 
Run Code Online (Sandbox Code Playgroud)

仅包含特定文件类型.


不过,基于" git log"的解决方案应该更好,例如:

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'
Run Code Online (Sandbox Code Playgroud)

但同样,这是针对一条路径(此处为2次提交),而不是针对每个分支的所有分支.


als*_*swl 9

一线代码(支持时间范围选择):

git log --since=4.weeks --numstat --pretty="%ae %H" | sed 's/@.*//g' | awk '{ if (NF == 1){ name = $1}; if(NF == 3) {plus[name] += $1; minus[name] += $2}} END { for (name in plus) {print name": +"plus[name]" -"minus[name]}}' | sort -k2 -gr
Run Code Online (Sandbox Code Playgroud)

说明:

git log --since=4.weeks --numstat --pretty="%ae %H" \
    | sed 's/@.*//g'  \
    | awk '{ if (NF == 1){ name = $1}; if(NF == 3) {plus[name] += $1; minus[name] += $2}} END { for (name in plus) {print name": +"plus[name]" -"minus[name]}}' \
    | sort -k2 -gr

# query log by time range
# get author email prefix
# count plus / minus lines
# sort result
Run Code Online (Sandbox Code Playgroud)

输出:

user-a: +5455 -3471
user-b: +5118 -1934
Run Code Online (Sandbox Code Playgroud)

  • 在仓库的整个生命周期中,每次我需要问这个问题时,我都会访问这个答案;我所做的就是将 4.weeks 更改为 10.years (2认同)