どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

Jupyter Notebook(ipynb)の実質コードのみをgitリポジトリ管理するには

f:id:ni66ling:20180102023826p:plain

はじめに

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

うまくいっているか、コミット履歴を確認してみてください。

参考

*1:詳細は末尾の参考文献を参照してください。

*2:コマンドjqを必要とします。コマンドjqをインストールしていない場合は、jqをインストール(macなら$ brew install jq) してください。

*3:場合によっては新規作成してください。