Jupyter Notebook(ipynb)の実質コードのみをgitリポジトリ管理するには
はじめに
Jupyter Notebook(ipynb)をなるべくマシなバージョン管理方法がないか調べてみました。
実現したいことを簡単にならべると次の通り。
- jupyter notebook(ipynb)をgitでバージョン管理したい。
- 実行の都度変わる実行結果はコミットしたくない。
実質的なソースコードの変更のみコミットしたい。 - コミット前後で実行結果が勝手に削除されたくない。
ローカルのファイルに対して変更は加えたくない。
これを実現する手順を述べます。
方針
jupyter notebookはJSON形式で保存されています。
実質的なソースコード、実行結果、メタ情報など、それぞれ異なるキーで格納されています。
そこで、gitのフィルタ処理*1にて、コミット直前に実行結果のキーに対応する値をnullとして扱い、コミットするように設定します。
手順
1) gitリポジトリ作成
$ mkdir repo_dir $ cd repo_dir $ git init
2) gitの設定で「コミット時にjupyter notebookの実行結果を除去するフィルタ処理」を追加
以下ファイルを開き、
$ vim .git/config
以下を追記*2。
[filter "clean_ipynb"] clean = jq --indent 1 --monochrome-output '. + if .metadata.git.suppress_outputs | not then { cells: [.cells[] | . + if .cell_type == \"code\" then { outputs: [], execution_count: null } else {} end ] } else {} end' smudge = cat
続いて、以下ファイルを開き、
$ vim .git/info/attributes
以下を追記*3。
*.ipynb filter=clean_ipynb
3) コミット
$ git add hoge.ipynb $ git commit
うまくいっているか、コミット履歴を確認してみてください。