【问题标题】:Version control of Mathematica notebooksMathematica 笔记本的版本控制
【发布时间】:2011-02-18 11:40:11
【问题描述】:

当然,Mathematica 笔记本是纯文本文件——期望它们与版本控制系统(在我的情况下是 git,尽管我怀疑特定系统是否重要)可以很好地配合似乎是合理的。但事实是任何 .nb 文件都充满了缓存信息、时间戳和其他各种元数据。数不胜数。

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

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

【问题讨论】:

  • 对于真正的合并冲突,您无能为力,因为两个人确实以相互冲突的方式编辑同一事物。正如您所说,Mathematica 无法打开带有冲突标记的文件(或在内部进行三向差异),因此您必须自己以文本形式解决它们。不过,Michael Pilat 的回答应该有助于解决元数据冲突。
  • 这里不熟悉mathematica -- .nb 文件是自动生成的吗?如果是这样,请不要将它们置于版本控制之下。
  • @hasen j:.nb 文件不是完全自动生成的,但其中有自动生成的元数据。我认为 Michael Pilat 的回答现在消除了这方面的困惑。
  • @hasen j:作为 dreeves 所说的补充,.nb(笔记本)文件是存储 Mathematica 内容(代码)的主要方式。如果有什么东西应该在版本控制之下,他们应该。

标签: git version-control wolfram-mathematica


【解决方案1】:

只有在源代码控制系统检测到多个用户对单行所做的更改时,您才应该获得合并标记。

源代码控制系统会添加标记以明确冲突的位置,并强制您手动删除它们(在您解决每个冲突时)。源代码控制系统无法知道如何自动为您执行此操作。

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

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

【讨论】:

  • 文件格式对问题很重要。在实践中,它并不是特别漫长。正如我所提到的,问题在于它充满了元数据。我知道合并过程的全部内容,但在大多数情况下,我们并没有处理协调两个代码版本的问题——大多数情况下,冲突发生在元数据中,我认为我们不在乎我们采用哪个版本。在我们必须手动合并代码的情况下,问题是询问有用的方法。独家结帐是显而易见的答案,但我希望将其保留为最后的手段。
【解决方案2】:

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

这很容易通过选项检查器禁用。在 Mathematica 菜单中,转到 FormatOption Inspector...,在左上角将 scope 下拉菜单设置为 Selected笔记本 并在搜索字段中搜索FileOutlineCache。将选项设置为 False 并保存您的笔记本,您应该已准备就绪。

请注意,这会使打开笔记本的速度稍微慢一些,但除非笔记本很大,否则您可能不会注意到差异。

【讨论】:

  • 谢谢!不能解决我的整个问题,但它让我大部分时间都在那里 - 我只是尽量避免必须合并实际的单元格内容,并在绝对必要的情况下在文本编辑器中通过它。 :)
  • 另一个您可能想要禁用的选项是 TrackCellChangeTimes
  • Cell --> Delete All OutputNotebook History 菜单选项也很有用。包AuthorToolsNotebookDiff,可以挂接到VCS 的diff 命令中。最后,有一个
  • ... Tim Wichmann 的旧 Perl 脚本 nbcache -- 但它可能需要更新。
【解决方案3】:

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

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

我们主要将 Mathematica 用于小型证明、探索和旁道,因此上述过程对我们来说效果很好(我们的主要文档在 LaTeX 中,它为非数学家/非程序员生成更友好的文档)

【讨论】:

    【解决方案4】:

    按照 Simon 和 Kena 所说的那样,当我将 Mathematica .nb 置于版本控制之下时,我经常只创建输入代码的纯文本版本,并以相同的名称但以 .txt 扩展名保存它.虽然这并不能直接解决合并问题,但它确实使 diff-ing 以合理的方式工作,并且当我稍后返回编辑 .nb 时使手动合并更加明显。这种格式仍有一些特点,但它比原始 .nb 格式更容易阅读。

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          *.nb    filter=dropoutput_nb
          

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

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

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

          notebook_file.nb    !filter
          

          免责声明:我是此工具的作者。它是开源的,欢迎反馈(好的和坏的)。 欢迎在Github 上投稿。

          【讨论】:

            猜你喜欢
            • 2011-06-21
            • 2011-12-23
            • 1970-01-01
            • 2023-04-05
            • 2010-10-01
            • 1970-01-01
            • 2011-09-28
            • 2012-05-31
            • 2011-12-17
            相关资源
            最近更新 更多