每个作者的GIT贡献(行数)

798qvoo8  于 2023-03-11  发布在  Git
关注(0)|答案(3)|浏览(149)

我正在尝试打印每个作者对Git存储库的每行贡献。
为此,我使用以下命令,该命令改编自How to count total lines changed by a specific author in a Git repository?

git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep  "^author "|sort|uniq -c|sort -nr

但是,我得到了以下错误:

fatal: cannot stat path 'HEAD': No such file or directory.

我哪里做错了?

1tu0hz3e

1tu0hz3e1#

好吧,经过进一步的调查,我发现这个对SO。

git ls-files -z | xargs -0n1 git blame -w | perl -n -e '/^.*?\((.*?)\s+[\d]{4}/; print $1,"\n"' | sort -f | uniq -c | sort -n

答案来自Eric Z的支持
结果

234926 USER 1
     32453 USER 2
   2941234 USER 3
w1jd8yoj

w1jd8yoj2#

这意味着表达式的第一部分没有给出任何结果。

git ls-tree -r -z --name-only HEAD -- */*.c

没有后面的部分;也许这会给你空的输出。修正这个表达式来列出你想要处理的文件...如果我在一个不包含任何.c文件的存储库中使用它;它给了我和你一样的错误。要么删除选项*/*.c,要么修复为*/*.cpp修复了它(取决于你想要的结果)

bprjcwpo

bprjcwpo3#

作为@chris-maes accepted answer的扩展名,下面是如何按文件扩展名分组:

EXTS=$(git ls-files | sed 's/^.*\.//g' | sort | uniq)
for EXT in $EXTS; do
  echo -e "\n$EXT\n"
  git ls-files | 
    grep ".$EXT" | 
    xargs -r -n1 git blame -w | 
    perl -n -e '/^.*?\((.*?)\s+[\d]{4}/; print $1,"\n"' | 
    sort -f | uniq -c | sort -n
done

如果您希望过滤到特定作者,请使用posix regex

EXTS=$(git ls-files | sed 's/^.*\.//g' | sort | uniq)
for EXT in $EXTS; do
  echo -e "\n$EXT\n"
  git ls-files | 
    grep ".$EXT" | 
    xargs -r -n1 git blame -w | 
    perl -n -e '/^.*?\((.*?)\s+[\d]{4}/; print $1,"\n"' | 
    sort -f | uniq -c | sort -n |
    grep "James\|McGuigan"
done

相关问题