如何解决如何避免 Jupyter 单元 ID 一直在变化,从而避免发送 VCS 差异?
如 q/66678305 中所述,较新的 Jupyter 版本除了存储单元格的源代码和输出之外,还存储 ID 以用于例如链接到一个单元格。
然而,这些 ID 并不稳定,即使没有触及单元格的源代码,它们也会经常发生变化。因此,如果您将 .ipynb
文件置于版本控制之下,例如git,提交最终有很多听起来很有趣的“更改行”,与提交中所做的任何实际更改都不对应。喜欢,
{ "cell_type": "code","execution_count": null,-"id": "respected-breach",+ "id": "incident-winning","Metadata": {},"outputs": [],
有没有办法防止这种情况发生?
解决方法
Linux 上 Git 的答案。可能也适用于 MacOS,但不适用于 Windows。
最好不要对 Jupyter 保存的 .ipynb
文件进行 VCS,而是使用不包含所有易失性信息的 过滤 版本。为此,可以使用各种 git hooks;我使用的是基于 https://github.com/toobaz/ipynb_output_filter/blob/master/ipynb_output_filter.py 的。
奇怪的是,事实证明此脚本不能被修改以从单元格中删除 "id"
字段。也就是说,如果您尝试在过滤循环中删除该字段,例如
for field in ("prompt_number","execution_number","id"):
if field in cell:
del cell[field]
那么 write
中的 jupyter_nbformat
函数只会放回一个 id
。可以仅将 id 更改 id 为常量,但随后Jupyter 会抱怨 id 不唯一。
为了规避这一点,我现在使用这个过滤器和一个简单的 grep
来删除 ID:
#!/bin/bash
grep -v '^ *"id": "[a-z\-]*",$'
将其存储在例如~/bin/ipynb_output_filter.sh
,使其可执行 (chmod +x ~/bin/ipynb_output_filter.sh
) 并确保您拥有以下 ~/.gitattributes
文件:
*.ipynb filter=dropoutput_ipynb
并在您的 git 配置(全局 ~/.gitconfig
或项目)中
[core]
attributesfile = ~/.gitattributes
[filter "dropoutput_ipynb"]
clean = ~/bin/ipynb_output_filter.sh
smudge = cat
如果除此之外,您还想使用标准的 Python 过滤器,可以在 grep
中的 ~/bin/ipynb_output_filter.sh
之前调用它,例如
#!/bin/bash
~/bin/ipynb_output_filter.py | grep -v '^ *"id": "[a-z\-]*",$'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。