
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を開発してくれたようなので今後に期待です。
ご参考になれば幸いです!