我想使用Git对Jupyter Notebooks进行版本控制。不幸的是,默认情况下,Git和Jupyter笔记本无法很好地播放。 .ipynb
文件是.json
文件,不仅包含Python代码本身,还包含大量元数据(例如,单元执行计数)和单元输出。
大多数现有解决方案(例如Using IPython notebooks under version control)都依赖于从笔记本中删除输出和元数据。 (i)进行差异化时,它仍然保持.json
文件的结构,这很难读,并且(ii)意味着不能使用诸如Github上的输出显示之类的功能,因为在提交之前会删除输出。 / p>
我的想法如下:每当我运行git diff
时,Git都会自动使用jupyter nbconvert --to python filename.ipynb
从我的*.ipynb
源文件转换为*.py
纯Python文件。然后,它应该仅检测到影响代码本身的更改(而不是执行计数和输出,因为它们被nbconvert
删除了)而没有实际删除它们,并且应该使我的差异比未转换的{{1 }}文件。我不希望文件的.ipynb
版本被永久存储;它仅应用于.py
。我的理解是,只需将git diff
指定为nbconvert
驱动程序,就可以做到这一点,但是我无法使其正常工作。
我在包含以下内容的[diff] textconv
中创建了一个名为ipynb2py
的文件
/usr/local/bin
我已将以下内容添加到我的#!/bin/bash
jupyter nbconvert --to python $1
文件中
.gitconfig
然后将以下内容添加到我的[diff "ipynb"]
textconv = ipynb2py
文件中
.gitattributes
将*.ipynb diff=ipynb
textconv驱动程序分配给所有ipynb
格式的文件。
现在,我希望.ipynb
会在每次运行它时自动执行一次转换(我知道这会大大减慢速度,但是值得为VCing笔记本提供一个可行的选择),然后显示一个不错的可读差异,仅基于转换后笔记本状态 的差异。
当我执行git diff
时,它首先说git diff
,这告诉我Git正在按预期触发转换。但是,在经过[NbConvertApp] Converting notebook
结尾的长时间Python追溯之后,转换失败。
在出现fatal: unable to read files to diff
错误消息之前,我收到以下消息
fatal
当然,我怀疑nbformat.reader.NotJSONError: Notebook does not appear to be JSON: '\n# coding: utf-8\n\n# In[ ]:\n\nimport...
脚本调用ipynb2py
的方式存在问题,但是在我的仓库中运行nbconvert
的效果很好,所以不能是原因。
什么可能导致此错误?除了返回文本文件之外,有效的ipynb2py notebook.ipynb
驱动程序有什么要求?
textconv
答案 0 :(得分:2)
如果您仔细阅读documentation of gitattributes
(描述了textconv
配置选项的地方),您会注意到转换器程序必须将输出发送到标准输出:
...
执行二进制文件的文本差异
有时候,希望能看到文本转换版本的差异 一些二进制文件。例如,文字处理器文档可以是 转换为ASCII文本表示形式,以及文本的差异 如图所示。即使这种转换会丢失一些信息, 产生的差异对于人类观看很有用(但无法应用 直接)。
textconv
config选项用于为以下程序定义程序 执行这样的转换。该程序应该采取一个 参数,要转换的文件名,然后 生成结果 在标准输出上输入文字。...
因此,您必须在转换命令中添加--stdout
选项:
ipynb2py
#!/bin/bash
jupyter nbconvert --to python --stdout "$1"
答案 1 :(得分:0)
您是否尝试过直接提交笔记本。在查看版本控制jupyter笔记本时,我看到了与您类似的帖子,但是当我尝试使用它时,它似乎工作正常。
github上的示例笔记本