Mathematica笔记本的版本控制

Mathematica笔记本当然是纯文本文件 – 看起来他们应该和版本控制系统(git,在我的例子中,尽pipe我怀疑具体的系统问题)很好地合作。 但事实是,任何.nb文件都充满了caching信息,时间戳和其他各种元数据。 它的一大堆。

这意味着有限的版本控制是可能的 – 提交和回滚工作正常。 然而,合并是一场灾难 。 Mathematica不会打开带有合并标记的文件,文本编辑器也无法通过.nb文件。

有谁有任何运气把版本控制下的笔记本? 怎么样?

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

使用Option Inspector很容易禁用此function。 在Mathematica菜单中,转到格式选项检查器… ,在左上angular将范围下拉菜单设置为选定笔记本,并在search字段中searchFileOutlineCache 。 将该选项设置为False并保存笔记本,并且应该全部设置。

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

对于如何在Mathematica Stack Exchange中使用Mathematica进行版本控制,有一个很好的build议。 简而言之,理念是尽量减less.nb笔记本的使用,并尝试使用.m包(类似于上面的xuhdev和MMA用户所说的)来执行大部分的版本控制。 考虑到笔记本电脑的pipe理方式,这似乎相当明智。

完全不是解决您的合并问题的方法,但这是我们如何处理团队中的笔记本和源代码pipe理。 基本上,我们以对待二进制文件的方式对待Mathematica笔记本。 他们签入,但:

  • 我们总是保留一个PDF副本旁边的.nb(备份恢复信息,以防万一我们输了,由于某种原因,读取.nb文件的能力。仍然专有格式,但更广泛的一点,可能是Adobe和Wolfram不会同时消失)
  • 我们不允许合并
  • 我们代码审查只有最终产品(渲染的笔记本)而不是.nb文件。

我们主要使用Mathematica进行小样本,探索和偏旁testing,所以上述过程对我们来说工作得很好(我们的主要文档在LaTeX中,它为非math家/非程序员生成更友好的文档)

按照Simon和Kena的说法,当我在版本控制下使用Mathematica .nb时,我经常只创build一个纯文本版本的input代码,并保存为相同的名称,但是扩展名为.txt。 虽然这并不能直接解决合并问题,但是当我回过头去编辑.nb的时候,它确实能够合理地进行分解工作,并且使手工合并更加明显。 这种格式还有一些特质,但比原始的.nb格式更容易阅读。

为了生成文本文件,我只是将笔记本复制到一个新的空白笔记本(快捷键,Ctrl-A,C,N,V)中,select菜单Cell-> Delete All Output,复制结果(Ctrl-A,C ),然后将结果粘贴到纯文本编辑器中进行保存。 一旦你掌握了它,它会花费很less的时间。

那么,我的解决scheme是不使用笔记本进行跟踪,但使用纯文本文件(而不是“笔记本”纯文本)。

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

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

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

源代码pipe理系统添加标记,以便在非常清楚冲突的位置,并强制您手动删除它们(解决每个冲突时)。 源代码pipe理系统无法知道如何自动为您做。

如果该文件是文本文件,但只能被程序读取,则可能没有行尾字符(或非常长的行)。 因此,如果多人正在处理这样的文件,你会得到很多合并冲突。

我对nb文件格式并不熟悉,但通常解决这个问题的方法是确保一次只有一个人正在处理一个文件(即对nb文件使用独占检出模式)。

一种新的可能性是使用Mathematica笔记本mathematica-notebook-filter来分析Mathematica笔记本电脑,并mathematica-notebook-filter所有的输出单元和元数据,以便这些不会被提交到版本控制系统中。

在git的特定情况下,集成mathematica-notebook-filter是非常容易的,这样git在通过使用gitattributefilter计算diff时可以自动清理输出和元数据。 您将需要安装mathematica-notebook-filterfilter并将其添加到您的pathvariables(或者调整下面的configuration以指向二进制文件),并将以下行添加到您的~/.gitattributes文件中:

 *.nb filter=dropoutput_nb 

这指示git使用在~/.gitconfig定义的dropoutput_nbfilter来parsing匹配*.nb所有文件,如下所示:

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

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

 notebook_file.nb !filter 

免责声明:我是这个工具的作者。 它是开放源码和反馈(好的和坏的)是赞赏。 在Github上欢迎贡献。