Gitログからチームを可視化するツール、gilotの各種コマンド(log,plot,info,hotspot,hotgraph,author)をWindowsで試してみた

前回の続き。

試していなかった、 info , hotspot , hotgraph , author といったコマンドを試してみる。

環境

gilotのアップデート

前回試してからgilotをアンインストールしていたため、インストールしようとしたらエラー。

pip install gilot
    (中略)
    Running setup.py install for python-Levenshtein ... error
    ERROR: Command errored out with exit status 1:
    (中略)
    error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/

どうも、前回試した後に、 Microsoft Visual C++ Build Tools をアンインストールしていたらしい。それぞれインストールして成功、gilotのバージョンは0.2.4。

cinst microsoft-visual-cpp-build-tools
pip install gilot
    (中略)
Successfully installed argparse-1.4.0 datetime-4.3 gilot-0.2.4 python-Levenshtein-0.12.0 python-louvain-0.14 zope.interface-5.1.0

また、後述する author コマンドによる出力で使用されるため、

IPAゴシック Ver.003.03をインストールしておくといい。

対象のリポジトリ

前回と同様、以降のコマンドはGit Bashで実行する。

試しに、 vuejs/vue リポジトリを対象にしてみる。

git clone https://github.com/vuejs/vue.git

logコマンド

gilot log Gitリポジトリパス でログ出力するのは前回と同じだが、 hotspothotgraph では、 --full オプションを付けて出力する必要がある。

--full を付けて出力しても、 plot によるグラフ出力ができなくなったりはしないため、とりあえず付けておくのが良さそう。

デフォルトブランチの dev を対象として、出力を実行。

gilot log --full --branch dev -o log-vue.csv vue/

あまり量が出ない。プルリクエストガイドラインによると、マージ前にsquashしているからか。

デフォルトでは直近6か月分が出力されるが、--month 整数 オプションで月数を変更したり、 --since YYYY-MM-DD--until YYYY-MM-DD で開始日・終了日を指定できる。

トータルで3,000コミット強程度のため、最初のコミットまで遡ってみる。日付は 11 Apr 2016 のため、 --since 2016-04-01 を指定。終了日も指定しないと、6か月後の2016/10/1までになるため、 --until 2020-09-01 も指定しておく。

gilot log --full --since 2016-04-01 --until 2020-09-01 --branch dev -o log.csv vue/

4分程度で出力完了。

解析コマンド共通オプション

共通で以下のオプションがある。詳細は、各コマンドのヘルプ参照。

オプション名 概要
-i ,
--input
logの出力結果をファイル出力している場合、そのパスを指定。
--allow-files 解析対象に含める、Gitリポジトリ上のファイルパス。
JavaMavenプロジェクトであれば 'src/main/*' を指定するなど。
--ignore-files 解析対象から除外する、Gitリポジトリ上のファイルパス。
--allow-files で指定したファイルパスから、特定のファイルを除外することができる。

いずれも、スペース区切りで複数記述したり、 *ワイルドカードとして使用できる。

実際のプロジェクトに対して実行する場合、ユニットテストを除外したりする必要がありそう。

plotコマンド

gilot plot で、logの結果をプロットした画像に変換できる。デフォルトでのタイムスロットは2週間ごとだが、4年半分と期間が長いため、 -t 1m で1か月単位にしてみる。

gilot plot -i log.csv -o plot.png -t 1m

結果は以下。

f:id:hepokon365:20200904000445p:plain
plot結果

infoコマンド

gilot info で、plotのグラフ生成元となる情報をJSONで出力可能。 -o オプションはないので、必要があればファイルにリダイレクトして出力する。 -t でタイムスロットは指定可能なので、以下のコマンドを実行。

gilot info -i log.csv -t 1m > info.json

結果は以下、長いので折り畳み。どうやら、タイムスロットの指定が効いていない模様。

info結果

{
    "gini": 0.7823790383228998,
    "output": {
        "lines": 922130,
        "added": 165974,
        "refactor": 0.8200101937904634
    },
    "since": "2016-04-11T11:47:28.000000000",
    "until": "2020-08-20T22:10:59.000000000",
    "timeslot": "2 Weeks",
    "insertions": {
        "mean": 4730.886956521739,
        "std": 9466.989587800872,
        "min": 0.0,
        "25%": 33.0,
        "50%": 195.0,
        "75%": 4341.0,
        "max": 53336.0
    },
    "deletions": {
        "mean": 3287.634782608696,
        "std": 7541.675235428418,
        "min": 0.0,
        "25%": 19.5,
        "50%": 152.0,
        "75%": 2620.5,
        "max": 52753.0
    },
    "lines": {
        "mean": 8018.521739130435,
        "std": 15533.282323544638,
        "min": 0.0,
        "25%": 62.5,
        "50%": 307.0,
        "75%": 7497.5,
        "max": 85416.0
    },
    "files": {
        "mean": 82.41739130434783,
        "std": 123.61243781516767,
        "min": 0.0,
        "25%": 4.5,
        "50%": 22.0,
        "75%": 140.0,
        "max": 831.0
    },
    "authors": {
        "mean": 5.756521739130434,
        "std": 6.069179117804726,
        "min": 0.0,
        "25%": 1.0,
        "50%": 4.0,
        "75%": 9.0,
        "max": 32.0
    },
    "addedlines": {
        "mean": 1443.2521739130434,
        "std": 7191.568304720781,
        "min": -45723.0,
        "25%": 0.0,
        "50%": 27.0,
        "75%": 1067.5,
        "max": 33762.0
    }
}

hotspotコマンド

gilot hotspot で、変更されやすいファイルを出力可能。これはグラフではなくテキストで出力される。

ヘルプを見ると -o オプションが用意されているが、 --csv オプションとセットで指定しないと標準出力に結果が表示されるため、リダイレクトする。

デフォルトでは30件出力される、件数の変更は -n 整数 オプションで可能。

gilot hotspot -i log.csv -n 10 > hotspot.txt

結果は以下。

------------------------------------------------------------
    gilot hotspot ( https://github.com/hirokidaichi/gilot )
------------------------------------------------------------
    
 hotspot  commits  authors file_name
    1.86      166        5 BACKERS.md
    1.30      174       28 README.md
    0.82       51        5 yarn.lock
    0.39      102        2 dist/vue.js
    (後略)

また、 --csv オプションでCSV出力も可能。このオプションを使用すると、 -o オプションによる出力先ファイル指定が有効となる。 また、 -n オプションは無視され、logで出力したコミットに含まれる全ファイルに対する解析結果が出力される。

gilot hotspot -i log.csv --csv -o hotspot.csv

結果は以下。 --csv オプションを付けない場合より、詳細な情報を取得できる。

file_name,hotspot,commits,authors,edit_rate,lines
BACKERS.md,1.8565003497904684,166,5,0.5469133051036327,4487
README.md,1.3033147402277916,174,28,0.5703506435863294,2253
yarn.lock,0.8172803516743423,51,5,0.6243990891456523,23714
dist/vue.js,0.3879481352423523,102,2,0.5622198102968241,42382
(後略)

hotgraphコマンド

同時に変更されることの多いファイルのネットワークを出力できる。

Windowsで実行する場合、 --stop-retry オプションを付けないとエラーが発生する。

gilot hotgraph -i log.csv -o hotgraph.png --stop-retry

結果は以下。コミットが多すぎて重なってしまった...

f:id:hepokon365:20200904010049p:plain
hotgraph結果

出力結果の調整をしたい場合、 -r 整数 でランクの閾値の変更ができる。デフォルトでは70の模様。小さくすると結果は少なく、大きくすると結果は多くなる。

また、オプションに --csv があるが、指定しても意味はなさそう。

authorコマンド

コミッターごとのコミット数や割合をグラフ化できる。

gilot author -i log.csv -o author.png

結果は以下。Evan Youさん無双。

f:id:hepokon365:20200904011707p:plain
author結果

デフォルトでは上位10名が出力される。 -t 整数 で人数の変更可能。

-n 文字列 オプションを指定すると、右上の「GIT LOG -- AUTHORS REPORT」の「--」が指定文字列となる。

また、 --only コミッター名 で、指定したコミッター以外を「Others」にできる。

gilot author -i log.csv -o author-only.png --only 'Evan You' 'vue-bot'

結果は以下。

f:id:hepokon365:20200904012442p:plain
author only結果

authorコマンド実行時の注意点

出力フォントにIPAゴシックを使用している模様。フォントがインストールされていないと、以下の警告が発生。

WARNING : findfont: Font family ['IPAGothic'] not found. Falling back to DejaVu Sans.

グラフ自体は出力されるが、コミッター名に日本語など非ASCII文字が含まれると文字化けする。

警告表示されたら、IPAゴシックをインストール後、 python -c "import matplotlib, shutil; print(matplotlib.get_cachedir());" で表示される matplotlib のキャッシュディレクトリを削除して再実行する。

振り返り

おそらく、 vuejs/vue-nextなど他のGitリポジトリも含めれば、また違った結果が出たかと思う。

あとは、plot結果のグラフの読み方を理解しないとだな...