cloc
使每个类型的每种语言(空白,注释或代码)能够计算存储在目录中的代码行数。
git blame
可以让人看到文件的哪个部分属于谁。
我正在寻找一种结合两者的方法,以便获得一个(三维)矩阵,列出每个用户每种语言的每种类型的代码行。
是否有优雅的内置方法可以执行此操作,还是应该“废弃”每个用户grep
之后的“{0}}”的“责备”部分并在其上运行git blame
计算每个用户的表格?
修改:
天真的方法(根据@Jubobs的评论):
cloc
之类的内容运行grep以捕获所有用户的列表,并使用grep "^[^(]*([^)]*)"
和sort
检索唯一身份用户。uniq
生成grep,以便只保留该用户的行。这或多或少是如何生成所需的输出。但是正如人们所看到的,这种方法进行了大量的复制(或者至少存储在内存中),并且实际上可以通过在文件上运行一次而不是多次来计算每个用户的行数。
期望的输出:
类似的东西:
grep "^[^(]*($user)"
答案 0 :(得分: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