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