将IPython笔记本保持在版本控制之下的好策略是什么?
Notebook 格式非常适合版本控制:如果想要对 Notebook 和输出进行版本控制,那么这非常有效。当人们只想对输入进行版本控制时,烦恼就来了,不包括可能是大二进制 blob 的单元输出(又名“构建产品”),尤其是对于电影和情节。特别是,我试图找到一个好的工作流程:
- 允许我在包含或排除输出之间进行选择,
- 如果我不想要它,可以防止我意外提交输出,
- 允许我将输出保留在本地版本中,
- 允许我使用我的版本控制系统查看输入何时发生更改(即,如果我只对输入进行版本控制但我的本地文件有输出,那么我希望能够查看输入是否已更改(需要提交). 使用版本控制状态命令将始终记录差异,因为本地文件有输出。)
- 允许我从更新的干净笔记本更新我的工作笔记本(包含输出)。(更新)
如前所述,如果我选择包含输出(例如,在使用nbviewer时这是可取的),那么一切都很好。问题是当我不想对输出进行版本控制时。有一些工具和脚本可以剥离笔记本的输出,但我经常遇到以下问题:
- 我不小心提交了带有输出的版本,从而污染了我的存储库。
- 我清除输出以使用版本控制,但实际上宁愿将输出保留在我的本地副本中(例如,有时需要一段时间才能重现)。
- 与菜单选项相比,一些去除输出的脚本会稍微改变格式
Cell/All Output/Clear
,从而在差异中产生不需要的噪音。这可以通过一些答案来解决。 - 在将更改拉到文件的干净版本时,我需要找到某种方法将这些更改合并到我的工作笔记本中,而无需重新运行所有内容。 (更新)
我已经考虑了几个我将在下面讨论的选项,但还没有找到一个好的综合解决方案。一个完整的解决方案可能需要对 IPython 进行一些更改,或者可能依赖于一些简单的外部脚本。我目前使用mercurial,但想要一个也适用于git的解决方案:理想的解决方案是版本控制不可知论。
这个问题已经讨论过很多次了,但是从用户的角度来看,并没有明确的或明确的解决方案。这个问题的答案应该提供明确的策略。如果它需要IPython的最新(甚至是开发)版本或易于安装的扩展,那很好。
更新:我一直在玩我修改过的笔记本版本,它可以选择使用Gregory Crosswhite 的建议.clean
在每次保存时保存一个版本。这满足了我的大部分限制,但未解决以下问题:
- 这还不是标准解决方案(需要修改 ipython 源。有没有办法通过简单的扩展来实现这种行为?需要某种 on-save 钩子。
- 我对当前工作流程的一个问题是拉动更改。这些将进入
.clean
文件,然后需要以某种方式集成到我的工作版本中。(当然,我总是可以重新执行笔记本,但这可能会很痛苦,尤其是如果某些结果依赖于长计算、并行计算等。)我还不知道如何解决这个问题. 也许涉及像ipycache这样的扩展的工作流可能会起作用,但这似乎有点太复杂了。
笔记
移除(剥离)输出
- 当笔记本运行时,可以使用
Cell/All Output/Clear
菜单选项来删除输出。 - 有一些用于删除输出的脚本,例如脚本nbstripout.py会删除输出,但不会产生与使用笔记本界面相同的输出。这最终被包含在ipython/nbconvert 存储库中,但是已经关闭,说明这些更改现在包含在ipython/ipython中,但相应的功能似乎还没有包含在内。 (更新)话虽如此,Gregory Crosswhite 的解决方案表明这很容易做到,即使不调用ipython/nbconvert,所以如果可以正确地连接这种方法,它可能是可行的。(但是,将它附加到每个版本控制系统似乎不是一个好主意——这应该以某种方式连接到笔记本机制。)
新闻组
问题
- 977:笔记本功能请求(打开)。
- 1280:清除所有保存选项(打开)。(来自这个讨论。)
- 3295:自动导出的笔记本:仅导出明确标记的单元格(已关闭)。由扩展解决11 添加 writeandexecute magic (Merged)。
拉取请求
- 1621:清除“清除所有输出”(合并)上的 In[] 提示编号。(另见2519(合并)。)
- 1563:clear_output 改进(合并)。
- 3065:笔记本的差异能力(已关闭)。
- 3291:添加保存时跳过输出单元格的选项。(关闭)。这似乎非常相关,但是由于建议使用“清洁/涂抹”过滤器而被关闭。一个相关的问题,如果你想在运行 git diff 之前去掉输出,你可以使用什么?似乎没有得到答复。
- 3312:WIP:笔记本保存挂钩(已关闭)。
- 3747: ipynb -> ipynb 变压器(关闭)。这是在4175中重新设置的。
- 4175:nbconvert:Jinjaless 出口商基地(合并)。
- 142:如果没有给出输入,则在 nbstripout 中使用 STDIN (Open)。