この記事を執筆しようと思ったきっかけ
業務において各人の生産量を図ることとなり、指標の一つとしてコミット数を用いる事となりました。
目視で数えることも可能だが、あまりにも非効率すぎるのでgitコマンドで取得できないか調査しました。
調査結果を備忘録かねてまとめます。
コミット数の取得方法
下記コマンドを使用することで指定ブランチの全コミットハッシュを取得することが出来ます。
git rev-list {ブランチ名}
使用オプションについて
コミットハッシュ数の取得のみでは誰が何件コミットしたか見える化出来てません。
また生産量を図るための指標取得が狙いなので期間指定も必要です。
そこで今回は以下オプションを追加しました。
- count
- リストされたコミット数を示す数値が表示されます
- since
- 特定の日付よりも新しいコミットが表示します
- until
- 特定の日付よりも古いコミットが表示します
- author
- コミット内容の著者を指定できます
最終的に出来上がったコマンドは以下の通りです。
オプションありバージョン
git rev-list --count {ブランチ名} --since={yyyy-MM-dd} --until={yyyy-MM-dd} --author={著者名}
自動化
ユーザ単位で期間指定のコミット数を取得することまで出来ました。
このままだと、コミット数を取得したい際に毎回手動でコマンド実行する必要があり非効率です。
そこで今回作成したコマンドを自動実行するシェルスクリプトを簡易的ながら作成しました。
スクリプトの説明は割愛します。また秘匿情報は伏せてます。
サンプルコード
#!/bin/bash
# 引数1と引数2で取得したい範囲を指定する
startDate=$1
endDate=$2
pattern="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
if ! [[ $startDate =~ $pattern ]]; then
echo "第一引数の開始日はYYYY-MM-DD形式で入力してください。"
exit 0;
fi
if ! [[ $endDate =~ $pattern ]]; then
echo "第二引数の開始日はYYYY-MM-DD形式で入力してください。"
exit 0;
fi
# ログファイル
cp /dev/null {ログファイルパス}
log={ログファイルパス}
# ユーザ名リスト
userNameArray=({ユーザー名})
workPath="{コミット数を取得したい作業パス}"
workPathArray=()
# workPathのディレクトリに格納されているフォルダ名を取得
for path in $workPath; do
if [ -d $path ]; then
workPathArray+=("$path")
fi
done
# ユーザ単位で作業パスに存在するコミット数を取得する
for userName in "${userNameArray[@]}"; do
exec &> >(echo "ユーザー名: "${userName}"" >> $log)
for path in ${workPathArray[@]}; do
# ディレクトリパスが変数pathに入っているが、ベースディレクトリのみ必要なのでbasenameを使って取得しbaseDirNameに格納する
baseDirName=$(basename ${path})
cd {コミット数を取得したい作業パス}/${baseDirName}
# バッククォート(`)で文字列中のコマンドを実行することができる。これを使って変数にコマンドの実行結果を代入。
commitNum=`sudo git rev-list --count ${baseDirName} --since=${startDate} --until=${endDate} --author="${userName}"`
# コミット数が0件であるなら不要データとなるので集計外とする
if [ ${commitNum} -eq 0 ]
then
continue
fi
exec &> >(echo "ディレクトリ名: ${baseDirName}, コミット数: $commitNum" >> $log)
done
done
参考文献
https://git-scm.com/docs/git-rev-list
https://runebook.dev/ja/docs/git/git-rev-list