在工做的時候,我經常會須要關注不少的信息。
工做在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