在git中显示每个作者修改的行数

vnjpjtjt  于 2023-01-15  发布在  Git
关注(0)|答案(6)|浏览(236)

我想查看Git历史记录中给定分支的已删除/添加行数,按作者分组。git shortlog -s显示了每个作者的提交数。有没有类似于获取整体差异统计的东西?

fquxozlt

fquxozlt1#

这是一个老职位,但如果有人仍然在寻找它:
安装git extras

brew install git-extras

那么

git summary --line

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

wecizke3

wecizke32#

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

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

解释:

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

输出:

user-a: +5455 -3471
user-b: +5118 -1934

更新:也许有人会喜欢我的小脚本:https://github.com/alswl/.oOo./blob/master/local/bin/git-code-numbers-by-authors

yfjy0ee7

yfjy0ee73#

由于the SO question "How to count total lines changed by a specific author in a Git repository?"并不完全令人满意,因此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

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

git ls-files | grep -v "\.\(pdf\|psd\|tif\)$"

(Note:如trcarden所述,-x--exclude选项不起作用。
如果--others--ignored被添加到git ls-files命令中,git ls-files -x "*pdf" ...将仅从git ls-files man page中排除 * 未跟踪 * 内容。)
或者:

git ls-files "*.py" "*.html" "*.css"

以仅包括特定文件类型。
不过," git log "-based solution应该更好,例如:

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

但这同样是针对一个路径(这里是2个提交),而不是针对每个分支的所有分支。

ovfsdjhp

ovfsdjhp4#

下面这个脚本就可以做到这一点。把它放到www.example.com中authorship.sh,chmod +x它,你就可以做好一切了。

#!/bin/sh
declare -A map
while read line; do
    if grep "^[a-zA-Z]" <<< "$line" > /dev/null; then
        current="$line"
        if [ -z "${map[$current]}" ]; then 
            map[$current]=0
        fi
    elif grep "^[0-9]" <<<"$line" >/dev/null; then
        for i in $(cut -f 1,2 <<< "$line"); do
            map[$current]=$((map[$current] + $i))
        done
    fi
done <<< "$(git log --numstat --pretty="%aN")"

for i in "${!map[@]}"; do
    echo -e "$i:${map[$i]}"
done | sort -nr -t ":" -k 2 | column -t -s ":"
2eafrhcq

2eafrhcq5#

在我的repos中,我已经从一行程序中得到了很多无用的输出,所以这里有一个Python脚本来做这件事:

import subprocess
import collections
import sys

def get_lines_from_call(command):
    return subprocess.check_output(command).splitlines()

def get_files(paths=()):
    command = ['git', 'ls-files']
    command.extend(paths)
    return get_lines_from_call(command)

def get_blame(path):
    return get_lines_from_call(['git', 'blame', path])

def extract_name(line):
    """
    Extract the author from a line of a standard git blame
    """
    return line.split('(', 1)[1].split(')', 1)[0].rsplit(None, 4)[0]

def get_file_authors(path):
    return [extract_name(line) for line in get_blame(path)]

def blame_stats(paths=()):
    counter = collections.Counter()
    for filename in get_files(paths):
        counter.update(get_file_authors(filename))
    return counter

def main():
    counter = blame_stats(sys.argv[1:])
    max_width = len(str(counter.most_common(1)[0][1]))
    for name, count in reversed(counter.most_common()):
        print('%s %s' % (str(count).rjust(max_width), name))

if __name__ == '__main__':
    main()

请注意,脚本的参数将传递给git ls-files,因此如果您只想显示Python文件:blame_stats.py '**/*.py'
如果只想显示一个子目录中的文件:blame_stats.py some_dir
等等。

qeeaahzv

qeeaahzv6#

How to count total lines changed by a specific author in a Git repository?开始
以下命令的输出应该可以相当容易地发送到脚本,以便将总数相加:

git log --author="<authorname>" --oneline --shortstat

这会给出当前HEAD上所有提交的统计信息。如果你想把其他分支的统计信息加起来,你必须把它们作为参数提供给git log。

相关问题