個人工具箱(一)—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

相關文章
相關標籤/搜索