May 24, 2019

git logから特定コミットの出力を抑止する

PHPでの開発中に製造工程の追加行数、削除行数を一覧化する必要が出たので、
以下の要領でファイル単位での各行数とその合計数を出力しました。

#!/bin/bash

## ライブラリやFW、テストコードは除外し、phpファイルの一覧をフルパスで取得
file_list=`find . -type d \( -name 'vendor' -o -name 'tests' -o -name 'system' \) \
           -prune -o -type f -name '*.php'`
## phpファイル単位でgit logを出力
for file in $file_list; do
  result=`git log --numstat --pretty="%H" --no-merges $file | \
          awk 'NF==3 {plus+=$1; minus+=$2} \
               END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'`
  echo $file' :'$result
done

けれど、途中コードフォーマットの修正を何回か行っており、それらのコミットについては
カウント対象から除外したかったので思案。

gitの公式リファレンスを見ると、git logのオプションで--invert-grepというのが指定できる様。
https://git-scm.com/docs/git-log#Documentation/git-log.txt---invert-grep

--grep=<pattern>オプションで指定したパターンにlogメッセージが一致しないコミットに出力を制限する、との事。
コミット時のメッセージに対応タスクのIDを含むルールとしていたので、以下で取り直し無事特定コミットを
行数カウントから除外する事ができました。

#!/bin/bash

## ライブラリやFW、テストコードは除外し、phpファイルの一覧をフルパスで取得
file_list=`find . -type d \( -name 'vendor' -o -name 'tests' -o -name 'system' \) \
           -prune -o -type f -name '*.php'`
## phpファイル単位でgit logを出力
for file in $file_list; do
  result=`git log --invert-grep --grep="タスクID" \
                  --numstat --pretty="%H" --no-merges $file | \
          awk 'NF==3 {plus+=$1; minus+=$2} \
               END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'`
  echo $file' :'$result
done

+----- Share ? -----+

© YK 2023

Powered by Hugo & Kiss.