Mathematica笔记本当然是纯文本文件-可以合理地预期它们应该与版本控制系统配合使用(在我的情况下为git,尽管我怀疑特定的系统很重要)。但是事实是,任何.nb文件都充满了缓存信息,时间戳和其他各种元数据。大量的。
这意味着可以进行有限的版本控制-提交和回滚可以正常工作。但是,合并是一场灾难。Mathematica不会打开其中带有合并标记的文件,并且文本编辑器无法处理.nb文件。
有人有幸将笔记本置于版本控制之下吗?怎么样?
Mathematica笔记本当然是纯文本文件-可以合理地预期它们应该与版本控制系统配合使用(在我的情况下为git,尽管我怀疑特定的系统很重要)。但是事实是,任何.nb文件都充满了缓存信息,时间戳和其他各种元数据。大量的。
这意味着可以进行有限的版本控制-提交和回滚可以正常工作。但是,合并是一场灾难。Mathematica不会打开其中带有合并标记的文件,并且文本编辑器无法处理.nb文件。
有人有幸将笔记本置于版本控制之下吗?怎么样?
Answers:
建议禁用文件轮廓缓存,即使用文本编辑器查看笔记本时要引用的元数据。正如您所发现的,如果多个参与方正在编辑同一笔记本,则可能导致合并冲突。
使用选项检查器可以轻松禁用此功能。在Mathematica菜单中,转到格式→选项检查器...,在左上角将范围下拉列表设置为选定笔记本,然后FileOutlineCache
在搜索字段中进行搜索。将选项设置为False并保存您的笔记本,您应该已经准备就绪。
请注意,这会使打开笔记本电脑的速度稍慢一些,但是除非笔记本电脑很大,否则您可能不会注意到其中的区别。
Cell --> Delete All Output
和Notebook History
菜单选项也很有用。该软件包AuthorTools
有 NotebookDiff
可能是挂到一个VCS的diff命令。最后,还有一个
在Mathematica Stack Exchange上,有一组关于如何使用Git对Mathematica进行版本控制的建议。简而言之,理念是尽量减少对.nb笔记本的使用,并尝试使用.m软件包进行大多数版本控制(类似于上面的xuhdev和MMA用户所说的内容)。考虑到笔记本的管理方式,这似乎非常明智。
不能完全解决您的合并问题,但这就是我们在团队中处理笔记本和源代码控制的方式。基本上,我们对待Mathematica笔记本的方式与对待二进制文件的方式相同。他们已签到,但是:
我们主要将Mathematica用于小型证明,探索和侧轨,因此上述过程对我们来说很好(我们的主要文档在LaTeX中,该文档为非数学家/非程序员提供了更友好的文档)
按照Simon和Kena的说法,当我拥有Mathematica .nb的版本控制时,我经常创建仅输入代码的纯文本版本,并以相同的名称保存,但扩展名为.txt。尽管这并不能直接解决合并问题,但确实可以合理地进行差异化,并且当我稍后再编辑.nb时,使手动合并更加明显。这种格式仍然有一些特质,但是比原始的.nb格式更容易阅读。
要生成文本文件,我只需将笔记本复制到一个新的空白笔记本中(使用快捷键Ctrl-A,C,N,V),选择菜单Cell-> Delete All Output,复制结果(Ctrl-A,C ),然后将结果粘贴到纯文本编辑器中进行保存。一旦掌握了窍门,只需很少的时间。
一种新的可能性是使用mathematica-notebook-filter
该方法来解析Mathematica笔记本并剥离所有输出单元格和元数据,以便不将其提交到版本控制系统中。
在git的特定情况下,集成起来非常容易,mathematica-notebook-filter
因此git在使用gitattribute过滤器计算差异时会自动清除输出和元数据。您将需要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上捐款。
好吧,我的解决方案不是使用Notebook进行跟踪,而是使用纯文本文件(而不是“ Notebook”纯文本)。
只要有笔记本,就可以使用“另存为...”菜单将当前文件另存为纯文本文件。当您需要加载时,只需用Mahthematica打开它即可。跟踪此文件比跟踪Notebook文件要好得多。我不确定使用纯文本格式而不是Mathematica笔记本可能会丢失哪些功能,但是到目前为止,我还没有发现任何缺陷。
参考:http : //www.topbug.net/blog/2013/05/02/track-mathematica-source-files-with-version-control-systems/
仅当源控制系统检测到多个用户对单行所做的更改时,才应获得合并标记。
源代码控制系统添加了标记,以使冲突位置很清楚,并迫使您手动将其删除(在解决每个冲突时)。源代码控制系统无法知道如何自动为您执行此操作。
如果文件是文本,但设计为只能由程序读取,则它可能根本没有行尾字符(或很长的行)。因此,如果有多个人正在处理这样的文件,您将遇到许多合并冲突。
我对nb文件格式不熟悉,但总的来说,解决此问题的方法是确保一次只有一个人在处理文件(即,对nb文件使用排他检出模式)。