未定の部屋

主にデータサイエンス関係の記事を書きます

ipynbファイルをいい感じにgit管理できるツールnbdimeを使ってみた

※2021年11月に書いた記事を再投稿したものになります

こんにちは。業務では主にデータ分析をしていて、普段はJupyter NotebookでPythonを書くことが多い人です。

きっかけ

Jupyter Notebookのファイルはipynbですが、このファイルはJSON形式で、ソースコードの他にメタデータやアウトプットデータが含まれています。そのためgitでipynbファイルを管理をするとなるとコードの変更だけでなくメタデータやアウトプットデータの変更分も加味されてしまいます。gitでipynbファイルを管理してみるとわかりますが、差分がJSON形式で表示されるのでファイルの差分がごちゃごちゃしてしまい見にくくなります。
そこで色々と調べたところ、nbdimeというツールを使うとipynbファイルのソースコードの差分だけを表示してくれて分かりやすそうだったので、使ってみました。

nbdimeのインストール

インストール環境はWindows 10 64 bit、Python3で行いました。また、gitは既にインストールされています。

Pythonの他のライブラリと同様に、
pip install nbdime
でインストールできます。
その後コマンドで、
nbdime config-git --enable --global
と打てば設定完了です。これでdiffとmergeのツールとして設定されます。 .gitconfigファイルに以下の内容が追加されていればOKです。

[diff "jupyternotebook"]
    command = git-nbdiffdriver diff
[merge "jupyternotebook"]
    driver = git-nbmergedriver merge %O %A %B %L %P
    name = jupyter notebook merge driver
[difftool "nbdime"]
    cmd = git-nbdifftool diff \"$LOCAL\" \"$REMOTE\" \"$BASE\"
[difftool]
    prompt = false
[mergetool "nbdime"]
    cmd = git-nbmergetool merge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[mergetool]
    prompt = false

自分はもともとdiff, mergeツールとしてp4mergeをconfigファイルに登録していたのですが、p4mergeとnbdimeを両方追加した状態だとうまくnbdimeでコードを見られなかったので、p4mergeをconfigから外したらうまく見られるようになりました。

簡単な運用例

コマンド上で差分を表示する

git diff [<commit ID、ブランチ名> <commit ID、ブランチ名>]
で表示できます。下の画像はPython

print('this is master')

print('this is merfe')

に書き換えた時の差分表示です。ちなみにmerfeはmergeのスペルミスです

web上で差分を表示する

nbdiff-web [<commit ID、ブランチ名> <commit ID、ブランチ名>]
で表示できます。コマンドの時と同じ例ですが、web上で見た方が分かりやすいですね。


マージの競合対処

競合が発生したときに、
git mergetool --tool nbdime -- *.ipynb
でweb上で競合対処ができます。

マージするときに不要な方にチェックをつけ、resolve conflictを押します。その後上部のsaveボタンを押し、close toolで画面を閉じると処理完了です。



こんな感じで、nbdimeを使えばipynbファイルでもいい感じにgit管理ができることが分かりました。まだ使い始めたばかりですが使用感はとてもいいです。今後も使ってみてもう少し理解を深めていこうと思います。
ではでは~


参考

  1. Jupyter Notebookの内部構造
  2. Jupyter Notebook ファイルのままdiffをとったり、マージしたり出来るツール nbdime
  3. nbdime(Scrapbox)
  4. 公式ドキュメント