当前位置: 首页 > 知识库问答 >
问题:

在版本控制下使用IPython笔记本

束作人
2023-03-14

笔记本格式非常适合版本控制:如果想要对笔记本和输出进行版本控制,那么这就很好地工作了。当你只想对输入进行版本控制,而不包括单元输出(也就是“构建产品”)时,麻烦就来了,这些单元输出可以是大的二进制blob,特别是对于电影和情节来说。特别是,我正在努力找到一个好的工作流程,它:

  • 允许我在包含或排除输出之间进行选择,
  • 防止我在不想要输出时意外提交输出,
  • 允许我在本地版本中保留输出,
  • 允许我使用版本控制系统查看输入何时发生了更改(即,如果我只对输入进行版本控制,但本地文件有输出,那么我希望能够查看输入是否发生了更改(需要提交)。使用版本控制状态命令将始终注册一个差异,因为本地文件有输出。)
  • 允许我从已更新的干净笔记本更新工作笔记本(其中包含输出)。(更新)

如前所述,如果我选择包含输出(例如,当使用nbviewer时,这是理想的),那么一切都很好。问题是当我不想对输出进行版本控制时。有一些工具和脚本用于剥离笔记本的输出,但我经常会遇到以下问题:

  1. 我不小心提交了带有输出的版本,从而污染了我的存储库。
  2. 我清除输出以使用版本控制,但实际上更愿意将输出保留在本地副本中(例如,有时需要一段时间才能重现)。
  3. 单元格/all output/clear菜单选项相比,一些去除输出的脚本稍微改变了格式,从而在差异中产生了不需要的噪声。一些答案解决了这个问题。
  4. 当将更改拉到文件的干净版本时,我需要找到一些方法将这些更改合并到我的工作笔记本中,而不必重新运行所有内容。(更新)

我已经考虑了我将在下文讨论的几个选项,但还没有找到一个好的全面解决方案。完整的解决方案可能需要对IPython进行一些更改,或者可能依赖于一些简单的外部脚本。我目前使用的是mercurial,但我想要一个同样适用于Git的解决方案:一个理想的解决方案是版本控制不可知的。

这个问题已经讨论过很多次了,但是从用户的角度来看,还没有一个确定的或者明确的解决方案。这个问题的答案应该提供确定的战略。如果它需要IPython的最新(甚至是开发)版本或易于安装的扩展,那也没问题。

    null
    null
    null
    null
  • 1621:在“清除所有输出”(合并)上的[]提示数字中清除。(另请参阅2519(合并)。)
  • 1563:clear_output改进(合并)。
  • 3065:笔记本的差异(已关闭)。
  • 3291:添加保存时跳过输出单元格的选项。(非公开)。这似乎是极其相关的,但与使用“清洁/污渍”过滤器的建议关闭。一个相关的问题,如果您想在运行git diff之前去掉输出,您可以使用什么?似乎没有得到答复。
  • 3312:WIP:笔记本保存挂钩(已关闭)。
  • 3747:IPynb->ipynb变压器(关闭)。这是在4175中重新建立的。
  • 4175:NBCONVERT:Jinjaless出口商基地(合并)。
  • 142:如果未给出输入(打开),则在nbstripout中使用STDIN。

共有1个答案

端木飞
2023-03-14

下面是我使用Git的解决方案。它允许您像往常一样添加和提交(和diff):这些操作不会改变您的工作树,同时(重新)运行一个笔记本也不会改变您的git历史记录。

虽然这可能可以适应其他VCS,但我知道它不能满足您的要求(至少VSC的不可知论性)。不过,它对我来说是完美的,尽管它并没有什么特别出色的地方,而且很多人可能已经在使用它了,但我在谷歌搜索的时候并没有找到关于如何实现它的明确说明。所以它可能对其他人有用。

>

  • 将包含此内容的文件保存在某个地方(对于以下内容,我们假设~/bin/ipynb_output_filter.py)
  • 使其可执行(chmod+x~/bin/ipynb_output_filter.py)
  • 创建文件~/.GITAttributes,内容如下

    *.ipynb    filter=dropoutput_ipynb
    
    git config --global core.attributesfile ~/.gitattributes
    git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py
    git config --global filter.dropoutput_ipynb.smudge cat
    

    限制:

    • 它仅适用于Git
    • 在git中,如果您在branchsomebranch中,并且您做了git checkout otherbranch;git checkout some branch,通常希望工作树不变。在这里,您将丢失源在两个分支之间不同的笔记本的输出和单元格编号。
    • 一般而言,输出根本没有版本化,就像Gregory的解决方案一样。为了不在每次执行涉及签出的任何操作时都将其丢弃,可以通过将其存储在单独的文件中(但请注意,在运行上述代码时,提交id是未知的!),并可能对其进行版本控制(但请注意,这需要的不仅仅是git commit notebook_file.ipynb,尽管它至少可以使git diff notebook_file.ipynb免受base64垃圾的影响)来改变方法。
    • 也就是说,顺便说一句,如果您拉出包含某些输出的代码(即,由不使用此方法的其他人提交的代码),则输出将正常签出。仅丢失本地生成的输出。

    我的解决方案反映了这样一个事实:我个人不喜欢将生成的东西保持版本化--注意,进行涉及输出的合并几乎保证会使输出或您的生产力无效,或者两者都无效。

    编辑:

    >

  • 如果您确实采用了我建议的解决方案--也就是全局的--您将会遇到一些麻烦,以防您想要对输出进行版本化的git repo。因此,如果要禁用特定git存储库的输出过滤,只需在其中创建一个文件.git/info/attributes,使用

    **.ipynb筛选器=

    git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
    

  •  类似资料:
    • 什么是保持IPython笔记本版本控制的好策略? 笔记本格式非常适合进行版本控制:如果想要对笔记本和输出进行版本控制,那么这种方式非常有效。当人们只想对输入进行版本控制时,麻烦就来了,不包括单元输出(也称为“构建产品”),单元输出可以是大的二进制blob,尤其是电影和情节。特别是,我试图找到一个好的工作流程: 允许我在包括或排除输出之间进行选择, 防止我在不需要时意外提交输出, 允许我将输出保存在

    • 我运行一个iPython笔记本服务器,希望用户能够下载一个作为csv文件的pandas dataframe,这样他们就可以在自己的环境中使用它。没有个人数据,所以如果解决方案包括在服务器上编写文件(我可以这样做),然后下载该文件,我很乐意这样做。

    • 如何在IPython笔记本中显示LaTeX代码?

    • 给定一个在外部服务器上运行的iPython笔记本,是否有方法触发文件下载? 我希望笔记本能够将外部服务器上的文件下载到本地呈现笔记本的位置,或者从笔记本工作区执行直接字符串转储到文本文件中,本地下载。 一、 E.一个强大的工具是一个笔记本,它可以从数据库中查询、更改数据,并将查询结果下载为CSV文件。 一个快速的实验表明,包含以下内容的单元格会呈现一个下载文件的链接。我希望有一个比将数据呈现到ht

    • Unix was not designed to stop you from doing stupid things, because that would also stop you from doing clever things. — Doug Gwyn 你曾经遇到过误删除了某些文件而又希望恢复的情形吧? 本书中提及的最重要的技巧就是将 Puppet 的 配置清单(manifests)纳入像

    • 问题内容: 我正在使用内联模式下的IPython Notebook和plot命令绘制一个NumPy值数组。 结果输出为: 然后,我的图显示在这些输出线的下方。 有没有办法只显示图并从输出中隐藏? 问题答案: 您可以使用分号结束行。这样可以在生成图时抑制不必要的输出: 通常,使用分号可以阻止IPython从代码块的该行打印任何输出值。例如,执行包含代码的单元将不会输出。 另一种方法是将变量绑定到图: