个人工具箱(一)—git项目提交行数统计脚本

在工做的时候,我经常会须要关注不少的信息。
工做在git项目上,日常会去关注的主要是某一条提交记录是谁提交的,改动了什么。然而跳出纯粹的开发工做,还能够看到一些隐藏在其中的数据,想一想也是挺有趣的。
其中有一项最为直观的数据,代码行数。
以前看到过一条命令,做用是统计本身提交过的代码中增长的行数和减小的行数,以及总计行数git

git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "Added lines: %s Removed lines : %s Total lines: %s\n",add,subs,loc }' -

很惋惜的是,因为代码库的庞大,以及统计的范围包括了整个项目,每次我使用的时候,总会报一堆警告。更有甚者,个人总代码行数竟然是负的,这简直不能忍受。shell

warning: inexact rename detection was skipped due to too many files.
Added lines: 4870052 Removed lines : 5867815 Total lines: -997763

这条命令的基础是git log,那么,就从它开始改进。url

# 摘自 Git Manual
git log [<options>] [<revision range>] [[--] <path>...]

很清楚了,须要给git log加上路径以限定统计的范围。spa

git log --author="$(git config --get user.name)" --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "Added lines: %s Removed lines : %s Total lines: %s\n",add,subs,loc }' -

运行,获得结果以下。code

Added lines: 128517 Removed lines : 92160 Total lines: 36357

数据出来了,再加个色吧,看着对比更清晰些。增长的绿色,删除的红色,总计的蓝色。orm

git log --author="$(git config --get user.name)" --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "Added lines: \033[32m%s\033[0m Removed lines : \033[31m%s\033[0m Total lines: \033[34m%s\033[0m\n",add,subs,loc }' -

到了这一步,彻底能够用了。不过呢,这会把历史提交全拉出来统计,平常工做我会更加在乎最近一段时间的数据,1天/3天/1周/1月的。改一下也很简单,git log --since=1.day这样就限定了只拉取最近一天提交了。而后再加个表格,加点基本信息,写成一个独立的脚本,搞定。图片

#!/bin/sh
#
# 统计提交行数
# 统计范围: src

if [[ ! -d '.git' ]]; then
    echo 'Not a git repository'
    exit
fi

echo 'name       '$(git config --get user.name)
echo 'email      '$(git config --get user.email)
echo 'remote url '$(git config --get remote.origin.url)
echo 'branch     '$(git symbolic-ref --short -q HEAD)
echo '\033[2m┌──────────┬─────────────┬───────────────┬─────────────┐\033[0m'
echo '\033[2m|\033[0m Time     \033[2m|\033[0m Added lines \033[2m|\033[0m Removed lines \033[2m|\033[0m Total lines \033[2m|\033[0m'
git log --author="$(git config --get user.name)" --since=1.day --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "\033[2m|\033[0m 1 day    \033[2m|\033[0m \033[32m%11s\033[0m \033[2m|\033[0m \033[31m%13s\033[0m \033[2m|\033[0m \033[34m%11s\033[0m \033[2m|\033[0m\n", add, subs, loc }' -
git log --author="$(git config --get user.name)" --since=3.day --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "\033[2m|\033[0m 3 days   \033[2m|\033[0m \033[32m%11s\033[0m \033[2m|\033[0m \033[31m%13s\033[0m \033[2m|\033[0m \033[34m%11s\033[0m \033[2m|\033[0m\n", add, subs, loc }' -
git log --author="$(git config --get user.name)" --since=1.week --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "\033[2m|\033[0m 1 week   \033[2m|\033[0m \033[32m%11s\033[0m \033[2m|\033[0m \033[31m%13s\033[0m \033[2m|\033[0m \033[34m%11s\033[0m \033[2m|\033[0m\n", add, subs, loc }' -
git log --author="$(git config --get user.name)" --since=1.month --pretty=tformat: --numstat -- src | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "\033[2m|\033[0m 1 month  \033[2m|\033[0m \033[32m%11s\033[0m \033[2m|\033[0m \033[31m%13s\033[0m \033[2m|\033[0m \033[34m%11s\033[0m \033[2m|\033[0m\n", add, subs, loc }' -
echo '\033[2m└──────────┴─────────────┴───────────────┴─────────────┘\033[0m'

呐,这就是最终效果了(终端配色方案为Dracula,非默认)
图片描述ip

相关文章
相关标签/搜索