Mathematica笔记本的版本控制

时间:2010-05-12 07:05:01

标签: git version-control wolfram-mathematica

Mathematica笔记本当然是纯文本文件 - 期望他们应该使用版本控制系统(在我的情况下是git,虽然我怀疑特定系统很重要)似乎是合理的。但事实是任何.nb文件都充满了缓存信息,时间戳和其他各种元数据。它的碎片。

这意味着可以进行有限版本控制 - 提交和回滚可以正常工作。但是,合并是灾难。 Mathematica不会打开包含合并标记的文件,并且文本编辑器无法通过.nb文件。

有没有人将笔记本电脑置于版本控制之下?怎么样?

7 个答案:

答案 0 :(得分:44)

建议禁用文件大纲缓存,这是您使用文本编辑器查看笔记本时所指的元数据。正如您所发现的,如果多方正在编辑同一个笔记本,它可能会导致合并冲突。

使用Option Inspector可以轻松禁用此功能。在Mathematica菜单中,转到格式选项检查器... ,在左上角设置范围下拉列表已选中Notebook 并在搜索字段中搜索FileOutlineCache。将选项设置为False并保存您的笔记本,您应该全部设置。

请注意,这可能会使打开笔记本电脑的速度变慢,但除非笔记本电脑相当大,否则您可能不会注意到差异。

答案 1 :(得分:10)

关于如何使用Git在Mathematica Stack Exchange使用Mathematica进行版本控制,有一套很好的建议。简而言之,理念是尽量减少.nb笔记本的使用,并尝试使用.m软件包进行大部分版本控制(类似于xuhdev和MMA用户所说的)。考虑到笔记本电脑的管理方式,这似乎是非常明智的。

答案 2 :(得分:6)

不完全解决您的合并问题,但这就是我们在团队中处理笔记本和源代码控制的方法。基本上,我们以对待二进制文件的方式对待Mathematica笔记本。他们已办理登机手续,但是:

  • 我们总是在.nb旁边保留一份pdf副本(用于恢复信息的备份,以防我们因某些原因丢失读数.nb文件的能力。仍然是专有格式,但有点广泛,并且可能都是Adobe和Wolfram不会同时消失)
  • 我们不允许合并
  • 我们只对最终产品(呈现的笔记本)进行代码检查,而不是.nb文件。

我们主要使用Mathematica进行小型校对,探索和侧轨,所以上述程序对我们来说很好(我们的主要文档是在LaTeX中,它为非数学家/非程序员提供了更友好的文档)

答案 3 :(得分:3)

与Simon和Kena所说的一样,当我使用Mathematica .nb进行版本控制时,我经常只创建输入代码的纯文本版本,并使用相同的名称保存它,但扩展名为.txt 。虽然这并没有直接解决合并问题,但它确实以合理的方式进行差异化工作,并且当我稍后再编辑.nb时,手动合并更加明显。这种格式仍有一些特性,但它比原始的.nb格式更容易阅读。

要生成文本文件,我只需将笔记本复制到新的空白笔记本中(使用快捷键,Ctrl-A,C,N,V),选择菜单Cell->删除所有输出,复制结果(Ctrl) -A,C),并将结果粘贴到纯文本编辑器中以保存它。一旦掌握了它,它就会花费极少的时间。

答案 4 :(得分:2)

一种新的可能性是使用mathematica-notebook-filter解析Mathematica笔记本并剥离所有输出单元格和元数据,以便它们不会被提交到版本控制系统。

在git的特定情况下,集成mathematica-notebook-filter非常容易,以便git在使用gitattribute filters计算差异时自动清除输出和元数据。您需要安装mathematica-notebook-filter过滤器并添加到路径变量中(或调整下面的配置以指向二进制文件)并将以下行添加到~/.gitattributes文件中:

*.nb    filter=dropoutput_nb

这指示git使用*.nb中定义的dropoutput_nb过滤器解析与~/.gitconfig匹配的所有文件:

[filter "dropoutput_nb"]
    clean = mathematica-notebook-filter
    smudge = cat

如果由于某种原因,您希望使用所有输出和元数据提交特定的Mathematica笔记本,则可以通过添加以下内容来禁用项目.gitattributes文件中的过滤器:

notebook_file.nb    !filter

免责声明:我是此工具的作者。它是开源的,并且赞赏反馈(好的和坏的)。   欢迎Github提供捐款。

答案 5 :(得分:1)

好吧,我的解决方案不是使用Notebook进行跟踪,而是使用纯文本文件(不是“Notebook”纯文本)。

只要有笔记本,就可以使用“另存为...”菜单将当前文件保存为纯文本文件。当您需要加载它时,只需使用Mahthematica打开它。跟踪此文件比跟踪Notebook文件要好得多。我不确定使用纯文本格式而不是Mathematica笔记本可能会丢失哪些功能,但到目前为止我还没有发现任何缺陷。

参考:http://www.topbug.net/blog/2013/05/02/track-mathematica-source-files-with-version-control-systems/

答案 6 :(得分:0)

如果源控制系统检测到多个用户对单行的更改,则只应获取合并标记。

源控制系统添加标记,以便在非常清楚冲突的位置时进行,并强制您手动删除它们(当您解决每个冲突时)。源控制系统无法知道如何自动为您执行此操作。

如果文件是文本,但设计为仅由程序读取,则它可能根本没有行尾字符(或非常长的行)。因此,如果有多个人正在处理此类文件,您将会遇到许多合并冲突。

我不熟悉nb文件格式,但一般来说,此问题的解决方案是确保一次只有一个人正在处理文件(即对nb文件使用独占签出模式)。