見出し画像

Jupyter notebook をgitにcommitするときに、自動的に不要なデータを削除する方法

最新版の記事を書きました

ぜひ、こちらを参照してください。


はじめに

jupyter notebookは便利ですが、gitで扱うときには少しケアが必要です。理由は


  • 単純なpythonコードではないので、変更履歴の管理が厄介。特にセルの出力まで管理したくない場合が多い。

  • notebookをそのままアップロードすると、メタデータが追加されたままになり少し気持ち悪い

です。そこで今回は、セルの出力とメタデータの削除をgitへのアップロード時に行うように設定してみました

方法

結論としては、gitフォルダ内の .git/hooks/pre-commit に以下を追加し、権限を設定すればOKです。

#!/bin/sh
# chmod u+x pre-commit
for file in $(git diff --cached --name-only); do
    if [[ $file == *.ipynb ]]; then
        # delete output
        # jupyter nbconvert --ClearOutputPreprocessor.enabled=True  \
        # --ClearOutputPreprocessor.remove_metadata_fields=[]  \
        # --ClearMetadataPreprocessor.enabled=True  \
        # --ClearMetadataPreprocessor.preserve_nb_metadata_mask='[("language_info"),("kernelspec")]' \
        # --to notebook --inplace ${file}
        # save output
        jupyter nbconvert \
        --ClearMetadataPreprocessor.enabled=True  \
        --ClearMetadataPreprocessor.preserve_nb_metadata_mask='[("language_info"),("kernelspec")]' \
        --to notebook --inplace ${file}
        
        jupyter nbconvert --to script $file
        git add ${file%.*}.py
        # git add .
    fi
done

このソースでやることは

  • commit時にセルの出力とメタデータの削除

  • ipynbをpythonファイルに変換して出力

を自動でやってくれます。

コメントアウトしているコード部分は、セルのアウトプットも削除する場合に使ってください。コメントアウトしていないものは、セルのアウトプットは残しながらメタデータを削除します。

権限の設定は

chmod u+x pre-commit

でOKです。このスクリプトで以下の通りgitを操作すると自動的に出力の削除と、リポジトリへのプッシュを行います。

git add .
git commit -m “message here”
git push

以下を参考にさせていただきました。

Useful git hooks for working with Jupyter notebooks/Data analysis · GitHub

git pre-commit hook to help support github-based code reviews of Jupyter notebooks in Python. · GitHub



他の方法



他の方法として以下もありますが、VScodeとの相性問題もありそうなのでトライしていません。

  • mwouts/jupytext: Jupyter Notebooks as Markdown Documents, Julia, Python or R scripts


あと、fast.ai がnbdev2を開発してくれたようなので今後に期待です。

ご参考になれば幸いです!