想统计自己总共提交了多少行代码?

作为一名程序员,我们很想知道自己到底提交了多少行代码到远程仓库,有没有什么工具能够帮我们统计自己写过的代码行数呢?答案是有的。这是本次博文的最终效果。
想统计自己总共提交了多少行代码?_第1张图片
对于代码提交行数统计,通过git 的系统命令就能做到,如下代码所示

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就行了,效果如图所示·
想统计自己总共提交了多少行代码?_第2张图片
但是有的人由于环境原因,为了区分一些环境,比如办公司叫:username.office 在家的电脑上叫做: user.home 诸如此类,难道得手动一个一个统计么?当然不行了。

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

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

如何使用?
0、将自己需要统计的项目文件目录整理到一个文件夹
1、讲users_name换成自己的的用户名
2、由于文件夹下可能有一些例外的不需要统计,添加该文件夹名
3、讲该shell脚本移动到某个名录下
4、最后利用 sh codeLine.sh 执行命令
想统计自己总共提交了多少行代码?_第3张图片
想统计自己总共提交了多少行代码?_第4张图片

########################################################
#
# 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脚本,所有其中的代码实现方式可能比较粗糙,望理解。

你可能感兴趣的:(花架子)