Mathematica笔记本的版本控制


71

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

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

有人有幸将笔记本置于版本控制之下吗?怎么样?


对于真正的合并冲突,您实际上无能为力,因为两个人确实确实以冲突的方式编辑相同的内容。如您所说,Mathematica无法使用冲突标记打开文件(或在内部进行三向比较),因此您必须自己以文本形式解决它们。Michael Pilat的答案应该有助于解决元数据冲突。
卡斯卡贝尔

这里不熟悉mathematica-是否自动生成.nb文件?如果是这样,请勿将其置于版本控制之下。
哈森

@hasen j:.nb文件不是完全自动生成的,但是其中有自动生成的元数据。我认为迈克尔·皮拉特(Michael Pilat)的答案现在消除了对此的困惑。
dreeves,2010年

3
@hasen j:为了补充dreeves所说的,.nb(笔记本)文件是存储Mathematica内容(代码)的主要方法。如果任何内容应受版本控制,则应该。
卡斯卡贝尔

Answers:


45

建议禁用文件轮廓缓存,即使用文本编辑器查看笔记本时要引用的元数据。正如您所发现的,如果多个参与方正在编辑同一笔记本,则可能导致合并冲突。

使用选项检查器可以轻松禁用此功能。在Mathematica菜单中,转到格式选项检查器...,在左上角将范围下拉列表设置为选定笔记本,然后FileOutlineCache在搜索字段中进行搜索。将选项设置为False并保存您的笔记本,您应该已经准备就绪。

请注意,这会使打开笔记本电脑的速度稍慢一些,但是除非笔记本电脑很大,否则您可能不会注意到其中的区别。


谢谢!不能解决我的全部问题,但是可以解决大部分问题-我将尽力避免合并实际的单元格内容,并在绝对必要时在文本编辑器中遍历它。:)
Etaoin

6
您可能要禁用的另一个选项是TrackCellChangeTimes
krawyoti,2010年

5
Cell --> Delete All OutputNotebook History菜单选项也很有用。该软件包AuthorToolsNotebookDiff可能是挂到一个VCS的diff命令。最后,还有一个
Simon,2010年

1
... Tim Wichmann的旧Perl脚本nbcache-但可能需要更新。
西蒙(Simon)

11

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


6

不能完全解决您的合并问题,但这就是我们在团队中处理笔记本和源代码控制的方式。基本上,我们对待Mathematica笔记本的方式与对待二进制文件的方式相同。他们已签到,但是:

  • 我们始终在.nb旁边保留一个pdf副本(如果由于某种原因而丢失了读取.nb文件的功能,则可用于恢复信息的备份。该格式仍然是专有格式,但是使用范围更广,并且Adobe和Wolfram都有可能不会同时消失)
  • 我们不允许合并
  • 我们仅对最终产品(渲染的笔记本)进行代码审查,而不对.nb文件进行代码审查。

我们主要将Mathematica用于小型证明,探索和侧轨,因此上述过程对我们来说很好(我们的主要文档在LaTeX中,该文档为非数学家/非程序员提供了更友好的文档)


3

按照Simon和Kena的说法,当我拥有Mathematica .nb的版本控制时,我经常创建仅输入代码的纯文本版本,并以相同的名称保存,但扩展名为.txt。尽管这并不能直接解决合并问题,但确实可以合理地进行差异化,并且当我稍后再编辑.nb时,使手动合并更加明显。这种格式仍然有一些特质,但是比原始的.nb格式更容易阅读。

要生成文本文件,我只需将笔记本复制到一个新的空白笔记本中(使用快捷键Ctrl-A,C,N,V),选择菜单Cell-> Delete All Output,复制结果(Ctrl-A,C ),然后将结果粘贴到纯文本编辑器中进行保存。一旦掌握了窍门,只需很少的时间。


2

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

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

*.nb    filter=dropoutput_nb

这指示git解析*.nbdropoutput_nb您定义~/.gitconfig为的过滤器匹配的所有文件:

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

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

notebook_file.nb    !filter

免责声明:我是这个工具的作者。它是开源的,反馈(好的和坏的)都值得赞赏。欢迎在Github上捐款。


1

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

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

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


0

仅当源控制系统检测到多个用户对单行所做的更改时,才应获得合并标记。

源代码控制系统添加了标记,以使冲突位置很清楚,并迫使您手动将其删除(在解决每个冲突时)。源代码控制系统无法知道如何自动为您执行此操作。

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

我对nb文件格式不熟悉,但总的来说,解决此问题的方法是确保一次只有一个人在处理文件(即,对nb文件使用排他检出模式)。


3
文件格式对于这个问题很重要。实际上,它并不是特别冗长。正如我提到的,问题在于它充满了元数据。我知道合并过程的全部内容,但是在大多数情况下,我们不会处理协调两个版本的代码的问题-多数情况下,冲突在于元数据中,而且我认为我们不在乎我们采用哪个版本。在某些情况下,我们必须手工合并代码,问题是询问这样做的有用方法。独家结帐是显而易见的答案,但我希望将其作为最后的选择。
埃陶因
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.