作为一名程序员,我们很想知道自己到底提交了多少行代码到远程仓库,有没有什么工具能够帮我们统计自己写过的代码行数呢?答案是有的。
目标 这是本次博文的最终效果。
统计代码行数的方式 对于代码提交行数统计,通过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 users_name=("julis" "julis.wang" "julis.wang.hp" ) filter_path=("Backend" "test" "sdk" "fork" "ArProject" ) export index=0 export add_line_count=0 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=$(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脚本,所有其中的代码实现方式可能比较粗糙,望理解。