【发布时间】:2013-09-15 02:19:37
【问题描述】:
让IPython 笔记本处于版本控制之下的好策略是什么?
notebook 格式非常适合版本控制:如果想要对 notebook 和输出进行版本控制,那么这很有效。当一个人只想对输入进行版本控制时,麻烦就来了,不包括可能是大二进制 blob 的单元输出(又名“构建产品”),尤其是对于电影和情节。特别是,我正在努力寻找一个好的工作流程:
- 允许我在包含或排除输出之间进行选择,
- 防止我在不需要时意外提交输出,
- 允许我在本地版本中保留输出,
- 允许我使用我的版本控制系统查看输入何时发生更改(即,如果我只对输入进行版本控制但我的本地文件有输出,那么我希望能够查看输入是否已更改(需要提交)。使用版本控制状态命令将始终记录差异,因为本地文件有输出。)
- 允许我从更新的干净笔记本更新我的工作笔记本(包含输出)。 (更新)
如前所述,如果我选择包含输出(例如,在使用 nbviewer 时这是可取的),那么一切都很好。问题是当我不想想要对输出进行版本控制时。有一些工具和脚本可以剥离笔记本的输出,但我经常遇到以下问题:
- 我不小心提交了带有输出的版本,从而污染了我的存储库。
- 我清除输出以使用版本控制,但实际上更愿意将输出保留在我的本地副本中(例如,有时需要一段时间才能重现)。
- 与
Cell/All Output/Clear菜单选项相比,一些去除输出的脚本会稍微改变格式,从而在差异中产生不需要的噪音。一些答案解决了这个问题。 - 在将更改提取到文件的干净版本时,我需要找到某种方法将这些更改合并到我的工作笔记本中,而无需重新运行所有内容。 (更新)
我已经考虑了几个我将在下面讨论的选项,但还没有找到一个好的综合解决方案。一个完整的解决方案可能需要对 IPython 进行一些更改,或者可能依赖于一些简单的外部脚本。我目前使用mercurial,但想要一个也适用于git 的解决方案:理想的解决方案是与版本控制无关。
这个问题已经讨论过很多次了,但是从用户的角度来看,并没有明确的或明确的解决方案。这个问题的答案应该提供明确的策略。如果它需要IPython 的最新(甚至是开发)版本或易于安装的扩展程序,那很好。
更新:我一直在玩my modified notebook 版本,它可以选择在每次保存时使用Gregory Crosswhite's suggestions 保存.clean 版本。这满足了我的大部分限制,但未解决以下问题:
- 这还不是标准解决方案(需要修改 ipython 源代码。有没有办法通过简单的扩展来实现此行为?需要某种 on-save 挂钩。
- 我在当前工作流程中遇到的一个问题是拉取更改。这些将进入
.clean文件,然后需要以某种方式集成到我的工作版本中。 (当然,我总是可以重新执行笔记本,但这可能会很痛苦,尤其是如果某些结果依赖于长计算、并行计算等。)我还不知道如何解决这个问题.也许涉及ipycache 之类的扩展的工作流可能会起作用,但这似乎有点太复杂了。
注意事项
移除(剥离)输出
- 当笔记本运行时,可以使用
Cell/All Output/Clear菜单选项来删除输出。 - 有一些用于删除输出的脚本,例如脚本nbstripout.py 会删除输出,但不会产生与使用笔记本界面相同的输出。这最终包含在 ipython/nbconvert 存储库中,但已关闭说明更改现在包含在 ipython/ipython 中,但似乎尚未包含相应的功能。 (更新) 话虽如此,Gregory Crosswhite's solution 表明这很容易做到,即使不调用 ipython/nbconvert,所以如果可以正确挂钩,这种方法可能是可行的。(附加它然而,对于每个版本控制系统来说,这似乎不是一个好主意——这应该以某种方式与笔记本机制挂钩。)
新闻组
问题
- 977: Notebook feature requests (Open)。
- 1280: Clear-all on save option (Open)。 (来自this discussion。)
- 3295: autoexported notebooks: only export explicitly marked cells (Closed)。已通过扩展 11 Add writeandexecute magic (Merged) 解决。
拉取请求
- 1621: clear In[] prompt numbers on "Clear All Output" (Merged)。 (另见2519 (Merged)。)
- 1563: clear_output improvements (Merged)。
- 3065: diff-ability of notebooks (Closed)。
- 3291: Add the option to skip output cells when saving. (Closed)。这似乎非常相关,但是由于建议使用“清洁/涂抹”过滤器而被关闭。一个相关的问题what can you use if you want to strip off output before running git diff? 似乎没有得到回答。
- 3312: WIP: Notebook save hooks (Closed).
- 3747: ipynb -> ipynb transformer (Closed)。这是在 4175 中重新设置的。
- 4175: nbconvert: Jinjaless exporter base (Merged)。
- 142: Use STDIN in nbstripout if no input is given (Open)。
【问题讨论】:
-
一旦你有一个用于删除输出的工作脚本,你可以在提交之前使用一个 Git “clean”过滤器自动应用它(参见 clean/smudge filters)。
-
@foobarbecue 该问题包含不令人满意的解决方法:每个问题都有至少一个限制。现在 PR 4175 已经合并了,大概可以制定一个完整的解决方案,但这仍然需要做。只要我有时间,如果其他人在此期间没有提供令人满意的解决方案,我会做(作为答案)。
-
@saroele 我还没有找到推荐的解决方案:我打算使用
--script选项,但它已被删除。我正在等到保存后挂钩 (which are planned) 实施后,我认为我将能够提供一个结合多种技术的可接受的解决方案。 -
@mforbes 看起来 PR 在您发表评论几天后才被合并。您或比我更有知识的人能否在这里发布一个答案,说明如何使用新功能?
-
@kobejohn:我刚刚添加了一个答案
标签: version-control ipython jupyter-notebook