摘錄自本人《Git聊天入門》的章節(jié):如何統(tǒng)計一段時間文件(或文件夾)的修改次數(shù)
為了快速了解代碼,有時候需要快速的查看代碼的統(tǒng)計信息,做一些宏觀的把握,上面這個需求可能會有些用處。
-
找到目標(biāo)日期之后的提交
-
--no-pager:git默認(rèn)使用linux的less模式顯示,即滿屏后提示用戶按一下按鍵才繼續(xù)顯示,加上此選項則可以一口氣打印完畢 -
%h:此處我只需要hash值,所以其他都省略了 -
--no-merges: 雖然merge也是工作量,但和我們的統(tǒng)計任務(wù)無關(guān)
-
kevin@:linux.git$ git --no-pager log --format=format:'%h' --no-merges --since 2019-06-10
fec6375320c6
e2e0e09758a6
aff7ed485168
f6581f5b5514
-
找到每次提交的修改文件
- awk:逐行處理上面查出的hash值,用 system() 命令轉(zhuǎn)給 git 去執(zhí)行
-
--stat-name-width=300:git diff的輸出默認(rèn)會壓縮到80列,使用...這種,這樣會丟失我想要的信息,所以我加大到300,應(yīng)該不會有丟棄了 -
--name-only:我只是想統(tǒng)計文件的個數(shù),并沒有計劃匯總每次、每個文件內(nèi)部變更的行數(shù),所以只要名字即可 -
"$1" "$1"~":最終會形成git diff xxx xxx~,為什么沒用^,效果一樣么?留作思考題 :) - 下面代碼中可以看到 hooks.c 文件在4次提交中被修改過2次
kevin@:linux.git$ git --no-pager log --format=format:'%h' --no-merges --since 2019-06-10 | \
awk '{system(" git --no-pager diff --stat-name-width=300 --name-only "$1" "$1"~") }'
security/selinux/hooks.c
security/selinux/hooks.c
security/selinux/avc.c
kernel/cred.c
kernel/ptrace.c
-
統(tǒng)計并數(shù)字顯示
-
fs[$0]+=1: 用文件名做key,value每次+1
-
kevin@:linux.git$ git --no-pager log --format=format:'%h' --no-merges --since 2019-06-10 | \
awk '{system(" git --no-pager diff --stat-name-width=300 --name-only "$1" "$1"~") }'| \
awk '{fs[$0]+=1} END{for(f in fs) printf("%d\t%s\r\n",fs[f],f) }' | sort -k 2
1 kernel/cred.c
1 kernel/ptrace.c
1 security/selinux/avc.c
2 security/selinux/hooks.c
-
還可以統(tǒng)計到某一層文件夾,而不是具體到每個文件
-
-e 's/[^/]*$//':去掉文件名,只留路徑 -
-e 's#/#|#1':精確匹配第1個/更換成|,這里的1可以自己修改,統(tǒng)計不同level的文件夾深度 -
-e 's/|.*//':把|以后的字符刪除 —— 這樣只留下我們想要的某個level深度的路徑
-
kevin@:linux.git$ git --no-pager log --format=format:'%h' --no-merges --since 2019-06-1 | \
awk '{system(" git --no-pager diff --stat-name-width=300 --name-only "$1" "$1"~") }'| \
sed -e 's/[^/]*$//' -e 's#/#|#1' -e 's/|.*//' | \
awk '{fs[$0]+=1} END{for(f in fs) printf("%10d\t%s\r\n",fs[f],f) }'|sort -k 2
676 arch
9 block
10 crypto
2 Documentation
2027 drivers
128 fs
286 include
2 ipc
43 kernel
21 lib
16 mm
103 net
9 samples
17 scripts
93 security
304 sound
114 tools
5 virt
上面是6.1至今(6.14),半個月來 Linux 的修改,仍然是 drivers 中的文件最多,達(dá)到 2027 件次(類比“人次”這個單位,哈哈),kernel 前幾天已經(jīng)發(fā)布5.1了,其實kernel文件夾半個月才更新了43個件次,還是超級穩(wěn)定的。
BTW:上面思考題的答案:用^ 和 ~ 是一樣的。