作为一名程序员,我们很想知道自己到底提交了多少行代码到远程仓库,有没有什么工具能够帮我们统计自己写过的代码行数呢?答案是有的。

目标

这是本次博文的最终效果。
一份结果图

统计代码行数的方式

对于代码提交行数统计,通过git 的系统命令就能做到,如下代码所示

1
2
3
git log --author='username' --pretty=tformat: --numstat | awk '
{add += $1; subs += $2; loc += $1 - $2 } END { printf "添加了%s,删除了%s,合计%s\n", add, subs, loc }' -

只需要在如下命令输入自己的username就行了,效果如图所示·
在这里插入图片描述

但是有的人由于环境原因,为了区分一些环境,比如办公司叫:username.office 在家的电脑上叫做: user.home 诸如此类,难道得手动一个一个统计么?当然不行了。

众所周知,由于工程项目变得更越来越大,拆库也说见不鲜,于是自己的代码分布不同的项目工程,我们想要利用git的统计命令的话就有点吃力了,需要一个一个地进入相应目录进行命令输入?当然不行了。

今天自己写了一份脚本主要用于统计分布在某个文件夹下所有的代码提交行数,git开源地址:https://github.com/VomPom/ForFun源码如下

如何使用?

0、将自己需要统计的项目文件目录整理到一个文件夹

1、讲users_name换成自己的的用户名

2、由于文件夹下可能有一些例外的不需要统计,添加该文件夹名

3、讲该shell脚本移动到某个名录下

4、最后利用 sh codeLine.sh 执行命令

在这里插入图片描述

在这里插入图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
########################################################
#
# Created by https://julis.wang on 2020/02/28
#
# Description : 统计代码提交行数
#
########################################################

#!/bin/bash

#这里添加你的git常用用户名。考虑到每个人的账号可能有很多个,所以定义成数组
users_name=("julis" "julis.wang" "julis.wang.hp")

#过滤一些不需要去遍历的文件夹
filter_path=("Backend" "test" "sdk" "fork" "ArProject")




########################################################
# 以下代码不需动
########################################################

export index=0 #记录当前的位置
export add_line_count=0 #添加的line总行数
export remove_line_count=0 #删除的总行数

export array_git_repositories=() #用于记录仓库名
export add_code=() #记录所有用户对某个库的添加的行数
export remove_code=() #记录所有用户对某个库的删除的行数

#判断是否需要过滤该目录
function is_fileter_dir() {
for i in "${!filter_path[@]}"; do
if [ $1 == "${filter_path[$i]}" ]; then
return 1
fi
done
return 0
}
#对命令执行的返回值进行数据切割
function get_add_remove_count() {
string=$1
array=(${string//,/ })
if [ ! ${array[0]} ]; then
add_line=0
else
add_line=${array[0]}
fi

if [ ! ${array[1]} ]; then
remove_line=0
else
remove_line=${array[1]}
fi

if [ ! ${add_code[$index]} ]; then
add_code[$index]=0

fi
if [ ! ${remove_code[$index]} ]; then
remove_code[$index]=0

fi
remove_code[$index]=`expr ${remove_code[$index]} + $remove_line`
add_code[$index]=`expr ${add_code[$index]} + $add_line`

echo "用户"$2"添加了="$add_line"行 删除了"$add_line"行"

}
#获取该用户在该文件夹下的提交代码数
function get_user_line() {
# output分别去接收 该文件夹下的提交以及删除行数
output=$(git log --author=${1} --pretty=tformat: --numstat | awk '
{add += $1; subs += $2; loc += $1 - $2 } END { printf "添加了%s,删除了%s,合计%s\n", add, subs, loc }' -)
get_add_remove_count $output ${1}
}

#遍历每个用户名
function trans_every_user() {
for i in "${!users_name[@]}"; do
get_user_line "${users_name[$i]}"
done
cd ..
}

# 整体流程,从文件夹出发
for path in `ls -l $(dirname $0)|awk -F " " '{print $9}'`
do
if [ -d $path ]
then
is_fileter_dir $path
if [ $? == 1 ]
then
echo "<=========过滤了【"$path"】======>"
else
echo "<=========获取【"$path"】的Git代码提交数据======>"
index=${#array_git_repositories[@]} #用于记录当前在第几个文件夹下处理
array_git_repositories=(${array_git_repositories[@]} $path)

cd $path
trans_every_user
fi
fi
done
all_add_line=0
all_remove_line=0
echo '==============================================================================='
echo " 本次共统计了【"${#array_git_repositories[@]}"】个仓库 by julis.wang "
echo '==============================================================================='
printf "%-30s %10s %10s %10s\n" "Folder" "Add" "Remove" "All"
echo '-------------------------------------------------------------------------------'
for ((i=0;i<${#array_git_repositories[@]};i++))
do
all_add_line=`expr $all_add_line + ${add_code[$i]}`
all_remove_line=`expr $all_remove_line + ${remove_code[$i]}`
printf "%-30s %10s %10s %10s\n" ${array_git_repositories[$i]} ${add_code[$i]} ${remove_code[$i]} `expr ${add_code[$i]} - ${remove_code[$i]}`
done
echo '-------------------------------------------------------------------------------'
printf "%-30s %10s %10s %10s\n" "Total" $all_add_line $all_remove_line `expr $all_add_line - $all_remove_line`
echo '==============================================================================='

写在最后:
由于本人不太擅长编写shell脚本,所有其中的代码实现方式可能比较粗糙,望理解。