将`cloc`与`git blame`结合起来

Wil*_*sem 18 git blame cloc git-blame

cloc 使每个类型的每种语言(空白,注释或代码)能够计算存储在目录中的代码行数.

git blame 使人能够看到文件的哪个部分属于谁.

我正在寻找一种结合两者的方法,以便获得一个(三维)矩阵,列出每个用户每种语言的每种类型的代码行.

是否有优雅内置的方式来做到这一点还是应该一个"报废"的"怪"的部分(运行grepgit blame)每个用户的,并运行cloc它们来计算表中的每个用户?


编辑:

天真的方法(基于@Jubobs的评论):

  1. 首先为目录中的每个文件生成一个blame文件(不必显式).
  2. 与一些运行的grep喜欢grep "^[^(]*([^)]*)"捕捉到所有用户的列表,并与检索唯一身份sortuniq.
  3. 对于每个用户:生成文件夹和grep的卷影副本,grep "^[^(]*($user)"使得仅保留该用户的行.
  4. 在卷影副本上运行cloc.
  5. 为每个用户执行此操作,存储结果并将它们一起输出.

这或多或少是如何生成所需的输出.但是正如人们所看到的,这种方法进行了大量的复制(或至少存储在内存中),并且实际上可以通过在文件上运行一次而不是多次来计算每个用户的行数.


期望的输出:

就像是:

+--------+--------------------------------+--------------------------------+
|User    | C#                             | XML                            |
+--------+-------+-------+---------+------+-------+-------+---------+------+
|        | files | blank | comment | code | files | blank | comment | code |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Foo    |    12 |    75 |     148 | 2711 |     2 |    42 |       0 |    0 |
| Bar    |   167 |  1795 |    1425 |    2 |    16 |     0 |     512 | 1678 | 
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Total  |   179 |  1870 |    1573 | 2713 |    18 |    42 |     512 | 1678 |
+--------+-------+-------+---------+------+-------+-------+---------+------+
Run Code Online (Sandbox Code Playgroud)

Jar*_*son 3

这是一个较老的问题,但它引起了我的兴趣,所以我开始尝试解决它。这不会输出一个很好的报告,但它确实将数据放入 csv 中,其中 3 列为:file extension, email of committer, # lines this user has committed for this file type。这也不会像 cloc 那样给出空白、注释、代码行。如果我有时间,我会尝试让所有这些工作顺利进行,但我认为这可能是一个“足够好”的解决方案,或者至少让您朝着正确的方向开始。

#!/bin/bash

LIST_OF_GIT_FILES=/tmp/gitfiles.txt
GIT_BLAME_COMBINED_RESULTS=/tmp/git-blame.txt
OUTPUT=/tmp/git-blame-output.txt
SUMMARY=code-summary.csv

rm $GIT_BLAME_COMBINED_RESULTS
git ls-files > $LIST_OF_GIT_FILES
while read p; do
  git blame -e -f $p >> $GIT_BLAME_COMBINED_RESULTS
done < $LIST_OF_GIT_FILES
awk -F ' ' '{print $2 "," $3}' $GIT_BLAME_COMBINED_RESULTS | tr -d '(<>' | awk -F ',' '{n = split($1, a, "."); print a[n] "," $2}' > $OUTPUT
sort $OUTPUT | uniq -c | sort -n | awk -F ' ' '{print $2 "," $1}' | sort > $SUMMARY

rm $GIT_BLAME_COMBINED_RESULTS
rm $LIST_OF_GIT_FILES
rm $OUTPUT
Run Code Online (Sandbox Code Playgroud)