在版本控制下使用IPython笔记本
使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之前剥离输出,可以使用什么?似乎没有得到答复。 …