Mathematica笔记本当然是纯文本文件 - 期望他们应该使用版本控制系统(在我的情况下是git,虽然我怀疑特定系统很重要)似乎是合理的。但事实是任何.nb文件都充满了缓存信息,时间戳和其他各种元数据。它的碎片。
这意味着可以进行有限版本控制 - 提交和回滚可以正常工作。但是,合并是灾难。 Mathematica不会打开包含合并标记的文件,并且文本编辑器无法通过.nb文件。
有没有人将笔记本电脑置于版本控制之下?怎么样?
答案 0 :(得分:44)
建议禁用文件大纲缓存,这是您使用文本编辑器查看笔记本时所指的元数据。正如您所发现的,如果多方正在编辑同一个笔记本,它可能会导致合并冲突。
使用Option Inspector可以轻松禁用此功能。在Mathematica菜单中,转到格式→选项检查器... ,在左上角设置范围下拉列表已选中Notebook 并在搜索字段中搜索FileOutlineCache
。将选项设置为False并保存您的笔记本,您应该全部设置。
请注意,这可能会使打开笔记本电脑的速度变慢,但除非笔记本电脑相当大,否则您可能不会注意到差异。
答案 1 :(得分:10)
关于如何使用Git在Mathematica Stack Exchange使用Mathematica进行版本控制,有一套很好的建议。简而言之,理念是尽量减少.nb笔记本的使用,并尝试使用.m软件包进行大部分版本控制(类似于xuhdev和MMA用户所说的)。考虑到笔记本电脑的管理方式,这似乎是非常明智的。
答案 2 :(得分:6)
不完全解决您的合并问题,但这就是我们在团队中处理笔记本和源代码控制的方法。基本上,我们以对待二进制文件的方式对待Mathematica笔记本。他们已办理登机手续,但是:
我们主要使用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文件使用独占签出模式)。