在工做的时候,我经常会须要关注不少的信息。
工做在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