如何防止Git提交Jupyter Notebook结果



我正在Jupyter Notebook中进行项目。

每当我提交时,不仅会提交更改的代码和降价列,还会提交代码列的结果。

这使得Git diffs无法读取,并且由于提交这些代码单元结果,很难审查拉取请求和更改。

有没有办法防止这种情况发生?

我强烈建议在.git/hooks/pre-commit中放入以下小脚本。它在所有要提交的.ipynb文件上使用nbconvert,如果在剥离所有输出后没有要提交的更改,则退出。最后一部分很重要,因为否则您将进行无用的空提交。由于它只在你提交的笔记本电脑上运行,它不会删除你仍在使用的其他笔记本电脑的所有输出。

#!/bin/bash
for f in $(git diff --name-only --cached); do
if [[ $f == *.ipynb ]]; then
jupyter nbconvert --clear-output --inplace $f
git add $f
fi
done
if git diff --name-only --cached --exit-code
then
echo "No changes detected after removing notebook output"
exit 1
fi

该脚本加上适当的.gitignore条目应该可以确保您的Git历史记录不受Jupyter输出的影响。


这里有一个兼容Husky的变体,只需将其保存在.husky/pre-commit中即可。

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
for f in $(git diff --name-only --cached); do
case "$f" in
*".ipynb") jupyter nbconvert --clear-output --inplace $f && git add $f ;;
esac
done
if git diff --name-only --cached --exit-code
then
echo "No changes detected after removing notebook output"
exit 1
fi

我建议设置一个预调试挂钩,以剥离笔记本上的渲染内容并写回文件。正如@Werner所建议的那样,git忽略.ipynb_checkpoints。

您有几个选项:

Jupytext(https://github.com/mwouts/jupytext),将允许您将.py文件作为Jupyter笔记本打开,由于它们不存储输入,因此差异将与任何其他源代码差异一样简单。

如果要保留.ipynb格式,可以使用nbdime(https://github.com/jupyter/nbdime)它产生了更好的笔记本diff(您可以将其与gitdiff集成(。

最新更新