619

将IPython笔记本保持在版本控制之下的好策略是什么?

Notebook 格式非常适合版本控制:如果想要对 Notebook 和输出进行版本控制,那么这非常有效。当人们只想对输入进行版本控制时,烦恼就来了,不包括可能是大二进制 blob 的单元输出(又名“构建产品”),尤其是对于电影和情节。特别是,我试图找到一个好的工作流程:

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

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

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

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

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

更新:我一直在玩我修改过的笔记本版本,它可以选择使用Gregory Crosswhite 的建议.clean在每次保存时保存一个版本。这满足了我的大部分限制,但未解决以下问题:

  1. 这还不是标准解决方案(需要修改 ipython 源。有没有办法通过简单的扩展来实现这种行为?需要某种 on-save 钩子。
  2. 我对当前工作流程的一个问题是拉动更改。这些将进入.clean文件,然后需要以某种方式集成到我的工作版本中。(当然,我总是可以重新执行笔记本,但这可能会很痛苦,尤其是如果某些结果依赖于长计算、并行计算等。)我还不知道如何解决这个问题. 也许涉及像ipycache这样的扩展的工作流可能会起作用,但这似乎有点太复杂了。

笔记

移除(剥离)输出

  • 当笔记本运行时,可以使用Cell/All Output/Clear菜单选项来删除输出。
  • 有一些用于删除输出的脚本,例如脚本nbstripout.py会删除输出,但不会产生与使用笔记本界面相同的输出。这最终被包含在ipython/nbconvert 存储库中,但是已经关闭,说明这些更改现在包含在ipython/ipython中,但相应的功能似乎还没有包含在内。 (更新)话虽如此,Gregory Crosswhite 的解决方案表明这很容易做到,即使不调用ipython/nbconvert,所以如果可以正确地连接这种方法,它可能是可行的。(但是,将它附加到每个版本控制系统似乎不是一个好主意——这应该以某种方式连接到笔记本机制。)

新闻组

问题

拉取请求

4

23 回答 23

133

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

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

  1. 将包含此内容的文件保存在某处(对于以下内容,让我们假设~/bin/ipynb_output_filter.py

  2. 使其可执行 ( chmod +x ~/bin/ipynb_output_filter.py)

  3. 创建文件~/.gitattributes,内容如下

    *.ipynb 过滤器=dropoutput_ipynb

  4. 运行以下命令:

    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 中,如果你在分支中somebranch并且你这样做git checkout otherbranch; git checkout somebranch了,你通常希望工作树保持不变。相反,您将丢失两个分支之间来源不同的笔记本的输出和单元格编号。
  • 更一般地说,输出根本没有版本控制,就像 Gregory 的解决方案一样。为了不只是在每次您执行任何涉及结帐的操作时都将其丢弃,可以通过将其存储在单独的文件中来更改方法(但请注意,在运行上述代码时,提交 ID 是未知的!),并可能对它们进行版本控制(但请注意,这需要的不仅仅是 a git commit notebook_file.ipynb,尽管它至少可以避免git diff notebook_file.ipynbbase64 垃圾)。
  • 也就是说,顺便说一句,如果您确实提取了包含一些输出的代码(即由其他人不使用这种方法提交),则输出将被正常检出。只有本地生产的输出会丢失。

我的解决方案反映了这样一个事实,即我个人不喜欢对生成的内容进行版本控制 - 请注意,进行涉及输出的合并几乎可以保证使输出您的生产力两者都无效。

编辑:

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

    **.ipynb 过滤器=

作为内容。显然,以同样的方式可以做相反的事情:仅对特定存储库启用过滤。

  • 代码现在保存在自己的git repo中

  • 如果上述说明导致 ImportErrors,请尝试在脚本路径前添加“ipython”:

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

编辑:2016 年 5 月(2017 年 2 月更新):我的脚本有几种替代方案 - 为了完整起见,这里列出了我知道的那些:nbstripout其他 变体)、nbstripjq

于 2013-12-30T17:35:23.120 回答
63

我们有一个合作项目,产品是 Jupyter Notebooks,在过去的六个月里,我们使用了一种效果很好的方法:我们激活了.py自动保存文件并跟踪.ipynb文件和.py文件。

这样,如果有人想查看/下载最新的笔记本,他们可以通过 github 或 nbviewer 进行,如果有人想查看笔记本代码的变化,他们只需查看.py文件的更改即可。

对于Jupyter笔记本服务器,这可以通过添加行来完成

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['jupyter', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

jupyter_notebook_config.py文件并重新启动笔记本服务器。

如果您不确定在哪个目录中可以找到您的jupyter_notebook_config.py文件,您可以输入jupyter --config-dir,如果您在该目录中找不到该文件,您可以通过输入 来创建它jupyter notebook --generate-config

对于Ipython 3笔记本服务器,这可以通过添加行来完成

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

ipython_notebook_config.py文件并重新启动笔记本服务器。这些行来自@minrk 提供的 github 问题答案,@dror也将它们包含在他的 SO 答案中。

对于Ipython 2笔记本服务器,这可以通过使用以下命令启动服务器来完成:

ipython notebook --script

或通过添加行

c.FileNotebookManager.save_script = True

ipython_notebook_config.py文件并重新启动笔记本服务器。

如果您不确定在哪个目录中可以找到您的ipython_notebook_config.py文件,您可以输入ipython locate profile default,如果您在该目录中找不到该文件,您可以通过输入 来创建它ipython profile create

这是我们在 github 上使用这种方法的项目:这是一个探索笔记本最近更改的 github 示例

我们对此非常满意。

于 2014-09-10T12:13:24.263 回答
39

我创建了nbstripout基于MinRKs gist的,它同时支持 Git 和 Mercurial(感谢 mforbes)。它既可以在命令行上独立使用,也可以作为过滤器使用,可以通过nbstripout install/轻松(卸载)安装在当前存储库中nbstripout uninstall

从PyPI或简单地获取它

pip install nbstripout
于 2016-02-27T13:32:21.687 回答
19

由于存在很多策略和工具来处理笔记本的版本控制,因此我尝试创建一个流程图来选择合适的策略(创建于 2019 年 4 月)

选择版本控制策略的决策流程

于 2019-04-23T09:25:10.387 回答
17

与 2019 年更好的方法相比,上面非常流行的 2016 年答案是不一致的黑客攻击。

存在多种选择,最能回答问题的是 Jupytext。

朱比文本

阅读有关 Jupytext的Towards Data Science 文章

它与版本控制一起工作的方式是将 .py 和 .ipynb 文件都放在版本控制中。如果您想要输入差异,请查看 .py,如果您想要最新的渲染输出,请查看 .ipynb。

值得注意的提及:VS studio、nbconvert、nbdime、hydrogen

我认为通过更多的工作,VS studio 和/或hydrogen(或类似的)将成为这个工作流程解决方案中的主导者。

于 2019-02-03T21:13:49.837 回答
15

更新:现在您可以 直接在 Visual Studio Code 中编辑 Jupyter Notebook文件。您可以选择编辑 notebook 或转换后的 python 文件。

我终于找到了一种高效且简单的方法来让 Jupyter 和 Git 很好地协同工作。我仍处于第一步,但我已经认为它比所有其他复杂的解决方案要好得多。

Visual Studio Code是来自 Microsoft 的一款酷炫的开源代码编辑器。它有一个出色的 Python 扩展,现在允许您将 Jupyter Notebook作为 Python 代码导入。现在您还可以直接编辑 Jupyter Notebooks

将 notebook 导入 python 文件后,所有代码和 markdown 都将放在一个普通的 python 文件中,并在注释中带有特殊标记。您可以在下图中看到:

带有笔记本的 VSCode 编辑器转换为 python

您的 python 文件只有笔记本输入单元格的内容。输出将在拆分窗口中生成。您在笔记本中有纯代码,它不会在您执行时更改。没有与您的代码混合的输出。没有奇怪的 JSON 难以理解的格式来分析您的差异。

只是纯 Python 代码,您可以在其中轻松识别每个差异。

我什至.ipynb不再需要对我的文件进行版本控制。我可以在里面放一条*.ipynb线.gitignore

需要生成笔记本以发布或与他人共享?没问题,只需点击交互式python窗口中的导出按钮

将 python 文件导出为 Notebook 格式

如果您直接编辑笔记本,现在有一个图标Convert and save to a python scriptVisual Studio Code 中的 Jupyter 图标

这是 Visual Studio Code 中笔记本的屏幕截图:

在 VSCode 中编辑笔记本

我只用了一天,但终于可以愉快地将 Jupyter 与 Git 一起使用。

PS:VSCode 代码补全比 Jupyter 好很多。

于 2018-11-21T00:48:50.167 回答
15

在删除笔记本中的输出几年后,我试图提出一个更好的解决方案。我现在使用Jupytext,这是我设计的 Jupyter Notebook 和 Jupyter Lab 的扩展。

Jupytext 可以将 Jupyter 笔记本转换为各种文本格式(脚本、Markdown 和 R Markdown)。反之亦然。它还提供了将笔记本与其中一种格式配对的选项,并自动同步笔记本的两种表示形式(一个.ipynb和一个.md/.py/.R文件)。

让我解释一下 Jupytext 如何回答上述问题:

允许我在包含或排除输出之间进行选择,

.md/.py/.R文件仅包含输入单元格。您应该始终跟踪此文件。.ipynb仅当您想跟踪输出时才对文件进行版本控制。

如果我不想要它,可以防止我意外提交输出,

添加*.ipynb.gitignore

允许我将输出保留在本地版本中,

输出保存在(本地).ipynb文件中

允许我使用我的版本控制系统查看输入何时发生更改(即,如果我只对输入进行版本控制但我的本地文件有输出,那么我希望能够查看输入是否已更改(需要提交). 使用版本控制状态命令将始终记录差异,因为本地文件有输出。)

.py/.Ror文件上的差异.md是您要查找的内容

允许我从更新的干净笔记本更新我的工作笔记本(包含输出)。(更新)

拉取.py/.Ror.md文件的最新版本并在 Jupyter (Ctrl+R) 中刷新您的笔记本。您将从文本文件中获得最新的输入单元格,并从文件中获得匹配的输出.ipynb。内核不受影响,这意味着您的局部变量被保留 - 您可以继续在离开它的地方工作。

我喜欢 Jupytext 的地方在于可以在您最喜欢的 IDE 中编辑笔记本(以 a .py/.R.md文件的形式)。使用这种方法,重构笔记本变得容易。完成后,您只需在 Jupyter 中刷新笔记本即可。

如果您想尝试一下:安装 Jupytextpip install jupytext并重新启动您的 Jupyter Notebook 或 Lab 编辑器。打开要进行版本控制的笔记本,并使用Jupyter 笔记本中的Jupytext 菜单(或 Jupyter Lab 中的Jupytext 命令)将与 Markdown 文件(或脚本)配对。保存您的笔记本,您将获得两个文件:原始文件,加上承诺的笔记本文本表示,非常适合版本控制!.ipynb

对于那些可能感兴趣的人:Jupytext 也可以在命令行上使用。

于 2019-06-22T17:52:08.320 回答
14

(2017-02)

策略

  • on_commit():
    • 剥离输出 > name.ipynb ( nbstripout, )
    • 剥离输出 > name.clean.ipynb ( nbstripout,)
    • 总是nbconvert对python:name.ipynb.py( nbconvert)
    • 始终转换为降价:name.ipynb.md ( nbconvert, ipymd)
  • vcs.configure():
    • git difftool、mergetool:来自 nbdime 的 nbdiff 和 nbmerge

工具

于 2017-02-09T04:40:37.997 回答
13

这是 Cyrille Rossant 为 IPython 3.0 提供的一个新解决方案,它保留在 markdown 文件而不是基于 json 的 ipymd 文件中:

https://github.com/rossant/ipymd

于 2015-02-21T22:09:36.877 回答
9

刚刚遇到看起来像一个完美解决方案的“jupytext”。它从笔记本生成一个 .py 文件,然后保持两者同步。您可以通过 .py 文件进行版本控制、差异化和合并输入,而不会丢失输出。当您打开笔记本时,它使用 .py 输入单元格和 .ipynb 输出单元格。如果你想在 git 中包含输出,那么你可以添加 ipynb。

https://github.com/mwouts/jupytext

于 2018-11-25T17:30:05.200 回答
8

正如所指出的,--script3.x. 可以通过应用保存后挂钩来使用此方法。特别是,将以下内容添加到ipython_notebook_config.py

import os
from subprocess import check_call

def post_save(model, os_path, contents_manager):
    """post-save hook for converting notebooks to .py scripts"""
    if model['type'] != 'notebook':
        return # only do this for notebooks
    d, fname = os.path.split(os_path)
    check_call(['ipython', 'nbconvert', '--to', 'script', fname], cwd=d)

c.FileContentsManager.post_save_hook = post_save

代码取自#8009

于 2015-03-11T15:27:32.377 回答
7

不幸的是,我对 Mercurial 了解不多,但我可以为您提供一个适用于 Git 的可能解决方案,希望您能够将我的 Git 命令翻译成与 Mercurial 等效的命令。

作为后台,在 Git 中,该add命令将已对文件所做的更改存储到暂存区域中。完成此操作后,Git 将忽略对文件的任何后续更改,除非您告诉它也将它们暂存。因此,下面的脚本,对于每个给定的文件,剥离所有的outputsand prompt_number sections,暂存剥离的文件,然后恢复原始文件:

注意:如果运行它会收到类似的错误消息ImportError: No module named IPython.nbformat,则使用ipython运行脚本而不是python.

from IPython.nbformat import current
import io
from os import remove, rename
from shutil import copyfile
from subprocess import Popen
from sys import argv

for filename in argv[1:]:
    # Backup the current file
    backup_filename = filename + ".backup"
    copyfile(filename,backup_filename)

    try:
        # Read in the notebook
        with io.open(filename,'r',encoding='utf-8') as f:
            notebook = current.reads(f.read(),format="ipynb")

        # Strip out all of the output and prompt_number sections
        for worksheet in notebook["worksheets"]:
            for cell in worksheet["cells"]:
               cell.outputs = []
               if "prompt_number" in cell:
                    del cell["prompt_number"]

        # Write the stripped file
        with io.open(filename, 'w', encoding='utf-8') as f:
            current.write(notebook,f,format='ipynb')

        # Run git add to stage the non-output changes
        print("git add",filename)
        Popen(["git","add",filename]).wait()

    finally:
        # Restore the original file;  remove is needed in case
        # we are running in windows.
        remove(filename)
        rename(backup_filename,filename)

在要提交更改的文件上运行脚本后,只需运行git commit.

于 2013-11-04T04:27:58.513 回答
6

我使用非常务实的方法;这适用于几个笔记本,在几个方面。它甚至使我能够“转移”笔记本。它适用于 Windows 和 Unix/MacOS。
艾尔觉得很简单,就是解决上面的问题……

概念

基本上,跟踪.ipnyb-files,只跟踪相应的.py-files。通过使用该选项
启动笔记本服务器--script,保存笔记本时会自动创建/保存该文件。

这些.py文件确实包含所有输入;非代码保存到注释中,单元格边框也是如此。可以将这些文件读取/导入(并拖动)到笔记本服务器中以(重新)创建笔记本。只有输出消失了;直到重新运行。

我个人使用mercurial对文件进行版本跟踪.py;并使用普通(命令行)命令添加,签入(等)。大多数其他 (D)VCS 将允许这样做。

现在追踪历史很简单;它们.py很小,文字和易于区分。有时,我们需要一个克隆(只是分支;在那里启动第二个笔记本服务器)或旧版本(签出并导入笔记本服务器)等。

提示与技巧

  • *.ipynb添加到 ' .hgignore ',以便 Mercurial 知道它可以忽略这些文件
  • 创建一个(bash)脚本来启动服务器(使用--script选项)并进行版本跟踪
  • 保存笔记本会保存.py-file,但不会其签入。
    • 这是一个缺点:人们可能会忘记
    • 这也是一个功能:可以保存笔记本(并稍后继续),而无需对存储库历史进行集群。

愿望

  • 在笔记本仪表板中有一个用于签入/添加/等的按钮会很好
  • 结帐到(通过示例)file@date+rev.py)应该会有所帮助添加它会做很多工作;也许我会这样做一次。直到现在,我只是手动完成。
于 2014-07-22T13:35:30.710 回答
4

我还将向其他人添加建议https://nbdev.fast.ai/这是最先进的“文学编程环境,正如 Donald Knuth 在 1983 年所设想的那样!”。

它还有一些 git 钩子可以帮助一点https://nbdev.fast.ai/#Avoiding-and-handling-git-conflicts和其他命令,例如:

  • nbdev_read_nbs
  • nbdev_clean_nbs
  • nbdev_diff_nbs
  • nbdev_test_nbs

因此,您还可以在编写库时随时随地创建文档,例如其中一些:

除了第一个链接之外,您还可以在此处查看视频nbdev 教程。

于 2020-06-19T23:56:40.370 回答
4

我已经构建了解决这个问题的 python 包

https://github.com/brookisme/gitnb

它提供了一个带有受 git 启发的语法的 CLI 来跟踪/更新/区分你的 git 存储库中的笔记本。

这是一个例子

# add a notebook to be tracked
gitnb add SomeNotebook.ipynb

# check the changes before commiting
gitnb diff SomeNotebook.ipynb

# commit your changes (to your git repo)
gitnb commit -am "I fixed a bug"

请注意,我使用“gitnb commit”的最后一步是提交到您的 git 存储库。它本质上是一个包装器

# get the latest changes from your python notebooks
gitnb update

# commit your changes ** this time with the native git commit **
git commit -am "I fixed a bug"

还有其他几种方法,并且可以配置为在每个阶段都需要或多或少的用户输入,但这就是一般的想法。

于 2017-06-02T15:21:20.283 回答
3

要跟进 Pietro Battiston 的出色脚本,如果遇到这样的 Unicode 解析错误:

Traceback (most recent call last):
  File "/Users/kwisatz/bin/ipynb_output_filter.py", line 33, in <module>
write(json_in, sys.stdout, NO_CONVERT)
  File "/Users/kwisatz/anaconda/lib/python2.7/site-packages/IPython/nbformat/__init__.py", line 161, in write
fp.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 11549: ordinal not in range(128)

您可以在脚本的开头添加:

reload(sys)
sys.setdefaultencoding('utf8')
于 2015-05-31T12:26:21.147 回答
3

翻来覆去,终于在 Jupyter 文档上找到了这个比较简单的 pre-save hook 。它剥离单元格输出数据。您必须将其粘贴到jupyter_notebook_config.py文件中(有关说明,请参见下文)。

def scrub_output_pre_save(model, **kwargs):
    """scrub output before saving notebooks"""
    # only run on notebooks
    if model['type'] != 'notebook':
        return
    # only run on nbformat v4
    if model['content']['nbformat'] != 4:
        return

    for cell in model['content']['cells']:
        if cell['cell_type'] != 'code':
            continue
        cell['outputs'] = []
        cell['execution_count'] = None
        # Added by binaryfunt:
        if 'collapsed' in cell['metadata']:
            cell['metadata'].pop('collapsed', 0)

c.FileContentsManager.pre_save_hook = scrub_output_pre_save

来自Rich Signell 的回答

如果您不确定在哪个目录中可以找到您的jupyter_notebook_config.py文件,您可以输入jupyter --config-dir[进入命令提示符/终端],如果您没有找到该文件,您可以通过输入jupyter notebook --generate-config.

于 2017-07-26T11:23:38.963 回答
3

这是 2020 年 4 月,有很多用于 Jupyter notebook 版本控制的策略和工具。以下是您可以使用的所有工具的快速概览,

  • nbdime - 非常适合笔记本的本地差异和合并

  • nbstripout - 一个 git 过滤器,用于在每次提交之前自动删除笔记本输出

  • jupytext - 将 .py 配套文件同步到每个笔记本。你只提交 .py 文件

  • nbconvert - 将笔记本转换为 python 脚本或 HTML(或两者)并提交这些备用文件类型

  • ReviewNB - 显示 GitHub 上任何提交或拉取请求的笔记本差异(连同输出)。还可以在笔记本单元格上写评论以讨论更改(下面的屏幕截图)。

在此处输入图像描述

免责声明:我建立了 ReviewNB。

于 2020-04-11T13:56:49.687 回答
1

好的,根据这里的讨论,看起来当前最好的解决方案是制作一个 git 过滤器,以便在提交时自动去除 ipynb 文件的输出。

这是我为使其正常工作所做的工作(从该讨论中复制):

当您无法导入最新的 IPython 时,我稍微修改了 cfriedline 的 nbstripout 文件以提供信息性错误: https ://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output 并将其添加到我的存储库中,让说在./relative/path/to/strip_notebook_output

还将文件 .gitattributes 文件添加到 repo 的根目录,其中包含:

*.ipynb filter=stripoutput

并创建了一个setup_git_filters.sh包含

git config filter.stripoutput.clean "$(git rev-parse --show-toplevel)/relative/path/to/strip_notebook_output" 
git config filter.stripoutput.smudge cat
git config filter.stripoutput.required true

并跑了source setup_git_filters.sh。花哨的 $(git rev-parse...) 事情是在任何(Unix)机器上找到你的仓库的本地路径。

于 2015-03-16T14:05:33.797 回答
1

我做了 Albert & Rich 所做的事——不要版本化 .ipynb 文件(因为这些文件可能包含图像,这会变得混乱)。相反,始终运行ipython notebook --script或放入c.FileNotebookManager.save_script = True您的配置文件,以便.py在您保存笔记本时始终创建一个(可版本化的)文件。

为了重新生成笔记本(在签出 repo 或切换分支之后),我将脚本py_file_to_notebooks.py放在我存储笔记本的目录中。

现在,在签出 repo 之后,只需运行python py_file_to_notebooks.py以生成 ipynb 文件。切换分支后,您可能必须运行python py_file_to_notebooks.py -ov以覆盖现有的 ipynb 文件。

为了安全起见,最好也添加 *.ipynb到您的.gitignore文件中。

编辑:我不再这样做,因为(A)每次签出分支时都必须从 py 文件重新生成笔记本,并且(B)笔记本中还有其他东西,比如你丢失的降价。我改为使用 git 过滤器从笔记本中剥离输出。关于如何做到这一点的讨论在这里

于 2015-02-18T14:38:34.250 回答
1

你可以使用这个 jupyter 扩展。它将使您能够直接将您的 ipython 笔记本上传到 github。

https://github.com/sat28/githubcommit

我还创建了一个演示步骤的视频 - youtube 链接

于 2018-01-17T11:02:31.807 回答
0

下面的帖子中讨论的想法怎么样,笔记本的输出应该保存在哪里,并认为生成它可能需要很长时间,而且它很方便,因为 GitHub 现在可以渲染笔记本。添加了用于导出 .py 文件的自动保存挂钩,用于 diff 和 .html 用于与不使用笔记本或 git 的团队成员共享。

https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d

于 2017-12-10T19:55:28.313 回答
0

我一直在研究一个开源框架——Ploomber,它可以帮助完成这项任务。它可以让您更快地使用笔记本,帮助您将其导出为原始 .py 文件并自动返回到笔记本。这样您就可以开发生产就绪的代码。然后你突然可以使用 git 和版本控制,而不必担心笔记本的输出是新的提交,即使代码没有改变。

于 2022-02-26T04:11:54.533 回答