git 如何統(tǒng)計一段時間文件(或文件夾)的修改次數(shù)

摘錄自本人《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:上面思考題的答案:用^~ 是一樣的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容