Gitでコミット数、変更行数、ファイル数を取得する色々

複数ユーザがいるrepositoryで自分の書いたコードがどれだけ占めるかを知りたい時に。

ユーザーごとのコミット数

git shortlogを使えば一発

1
git shortlog -nse

返り値

1
2
3
4
2651  Hoge <hoge@example.com>
1431 Piyo <piyo@example.com>
863 Honi <honi@example.com>
698 Puni <puni@example.com>

説明
-n コミット数降順に並べる
-s コミットメッセージを省略して一行にする
-e メールアドレスも表示する

変更行数

authorを指定して合算を取得する

1
git log  --author="hoge@example.com" --numstat --pretty="%H" --no-merges  | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'

参考 https://qiita.com/Night___/items/359ff81f358968567a45

一回のコミットで大きな変更があったファイルTop10

sort -r -nで降順に並べ替えてhead -10で切り抜く

1
$ git log  --numstat --pretty="%H" --no-merges | grep -E '^\d+?\t' | sort -r -n | head -10

特定の拡張子のファイルの変更を取得

grep -Eで絞り込む

1
$ git log  --numstat --pretty="%H" --no-merges | grep -E '^\d+?\t.+?\.(php|css|js|ctp|html|scss|json|xml)$' | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'

特定のパス以外のファイルの変更を取得

grep -vは一致しなかったものを返す

1
$ git log  --numstat --pretty="%H" --no-merges | grep -vE '^\d+?\t.+?\.(src|config|webroot)$' | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'

複数のユーザーのログを取得する

git --authorはOR指定できる

1
git log --author="@example.co.jp\|hoge\|piyo" --name-only --no-merges |  grep -E '^\d+?\t'

変更ファイル数

編集したファイル一覧を取り出す

git log --name-onlyでファイルパスのみ取得し、sortで並べ替え、uniqで重複行を消す

grep -vE '[a-z0-9]{40}'はコミットハッシュを弾いている

1
git log --since="2019-08-01" --name-only --no-merges --pretty="%H" | grep -vE '[a-z0-9]{40}' | sort | uniq > editfiles.txt

おまけ

編集したファイルの行数

1
wc -l editfiles.txt

編集してないファイル一覧

grep -fでfileで検索して一致/不一致を出せる。なおこの時は完全一致のみ

1
grep -xvf -files.txt editfiles.txt allfiles.txt  > uneditfiles.txt