2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事を執筆しようと思ったきっかけ

業務において各人の生産量を図ることとなり、指標の一つとしてコミット数を用いる事となりました。
目視で数えることも可能だが、あまりにも非効率すぎるのでgitコマンドで取得できないか調査しました。
調査結果を備忘録かねてまとめます。

コミット数の取得方法

下記コマンドを使用することで指定ブランチの全コミットハッシュを取得することが出来ます。

git rev-list {ブランチ名}
出力サンプル

image.png

使用オプションについて

コミットハッシュ数の取得のみでは誰が何件コミットしたか見える化出来てません。
また生産量を図るための指標取得が狙いなので期間指定も必要です。
そこで今回は以下オプションを追加しました。

count
リストされたコミット数を示す数値が表示されます
since
特定の日付よりも新しいコミットが表示します
until
特定の日付よりも古いコミットが表示します
author
コミット内容の著者を指定できます

最終的に出来上がったコマンドは以下の通りです。

オプションありバージョン
git rev-list --count {ブランチ名}  --since={yyyy-MM-dd} --until={yyyy-MM-dd} --author={著者名}
出力サンプル

image.png

自動化

ユーザ単位で期間指定のコミット数を取得することまで出来ました。
このままだと、コミット数を取得したい際に毎回手動でコマンド実行する必要があり非効率です。
そこで今回作成したコマンドを自動実行するシェルスクリプトを簡易的ながら作成しました。

スクリプトの説明は割愛します。また秘匿情報は伏せてます。

サンプルコード
#!/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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?