2010-05-12 76 views
63

Mathematica筆記本當然是純文本文件 - 似乎有理由期望它們應該與版本控制系統(git在我的情況下,儘管我懷疑具體系統很重要)很好玩。但事實是任何.nb文件都充滿了緩存信息,時間戳和其他各種元數據。它的一大堆。Mathematica筆記本的版本控制

這意味着有限的版本控制是可能的 - 提交和回滾工作正常。不過,合併是災難。 Mathematica不會打開帶有合併標記的文件,並且文本編輯器無法通過.nb文件。

有沒有人有任何運氣把版本控制下的筆記本?怎麼樣?

+0

有沒有真正太多可以做真正的合併衝突,當兩個人真正做編輯衝突的方式是一樣的。正如你所說,Mathematica無法打開帶有衝突標記的文件(或者在內部進行三向比較),因此您必須自己以文本形式解析它們。儘管Michael Pilat的回答應該有助於元數據衝突。 – Cascabel 2010-05-12 16:01:18

+0

這裏不熟悉mathematica - .nb文件是否自動生成?如果是這樣,請不要將它們置於版本控制之下。 – hasen 2010-05-12 18:07:59

+0

@hasen j:.nb文件並不是完全自動生成的,但其中有自動生成的元數據。我認爲邁克爾皮拉特的回答現在解決了這個問題。 – dreeves 2010-05-12 20:03:43

回答

43

建議禁用文件大綱緩存,這是您使用文本編輯器查看筆記本時所指的元數據。正如你發現的,如果多方正在編輯同一個筆記本,它可能會導致合併衝突。

使用Option Inspector很容易禁用此功能。在數學菜單,進入格式選項督察...,在左上角的範圍下拉菜單設置爲選擇筆記本並在搜索欄中搜索FileOutlineCache。將該選項設置爲False並保存筆記本,並且應該全部設置。

請注意,這可以使打開筆記本電腦有點慢,但除非筆記本電腦相當大,否則您可能不會注意到其中的差異。

+0

謝謝!這並不能解決我的整個問題,但它使我獲得了大部分的方式 - 我將盡量避免將實際的單元格內容合併,並在絕對必要的情況下通過文本編輯器進行操作。 :) – Etaoin 2010-05-14 01:24:17

+6

您可能想要禁用的另一個選項是TrackCellChangeTimes – krawyoti 2010-08-02 21:22:52

+5

也有用的是「單元格 - >刪除所有輸出」和「筆記本歷史記錄」菜單選項。 'AuthorTools'包具有'NotebookDiff',可以掛接到VCS的diff命令。最後,由Tim Wichmann的是一個 – Simon 2010-11-10 22:14:39

0

如果源控制系統檢測到多個用戶對單個行的更改,則只應獲取合併標記。

源代碼管理系統添加標記,以便在非常清楚衝突的位置以及強制您手動刪除它們(解決每個衝突時)。源控制系統無法知道如何自動爲您執行此操作。

如果文件是文本,但是被設計爲只能通過程序讀取,它可能根本沒有換行符(或很長的行)。因此,如果有多個人正在處理這樣的文件,您將會遇到很多合併衝突。

我對nb文件格式並不熟悉,但一般來說,解決此問題的方法是確保一次只有一個人正在處理文件(即對nb文件使用獨佔檢出模式) 。

+3

文件格式對於這個問題很重要。實際上,它並不是特別長。正如我所提到的那樣,問題是它充滿了元數據。 我知道合併過程是怎麼一回事,但在大多數情況下,我們面對的不是調和代碼的兩個版本的問題 - 對於衝突是元數據在大多數情況下,我不認爲我們關心我們採取哪個版本。在我們必須手動合併代碼的情況下,問題是詢問有用的方法。 獨家結賬是一個明顯的答案,但我希望把它作爲最後的手段。 – Etaoin 2010-05-12 07:44:58

6

完全不是您合併問題的解決方案,但這是我們處理團隊中的筆記本和源代碼控制的方式。基本上,我們以對待二進制文件的方式對待Mathematica筆記本電腦。他們簽入,但:

  • 我們始終保持一個PDF副本旁邊的.nb(備份恢復的情況下,我們失去了信息,出於某種原因,讀數.nb文件的功能仍然是專有的。格式,但更廣泛一些,並且Adobe和Wolfram的機會都不會同時消失)
  • 我們不允許合併
  • 我們代碼審查只有最終產品(渲染的筆記本)而不是.nb文件。

我們主要使用數學的小證據,探索和側鑽,所以上述過程爲我們工作得很好(我們的主要文件是乳膠,這對於非數學家產生友好的文檔/非程序員)

3

沿着Simon和Kena說的話,當我在版本控制下有Mathematica .nb的時候,我經常創建一個只有輸入代碼的純文本版本,並且保存它的名字不過是一個.txt擴展名。雖然這並沒有直接解決合併問題,但它確實能夠合理地進行差異化工作,並在稍後編輯.nb的時候使手動合併更加明顯。這種格式仍然有一些特質,但比原始的.nb格式更容易閱讀。要生成文本文件,我只需將筆記本複製到一個新的空白筆記本(帶快捷鍵,Ctrl-A,C,N,V)中,選擇菜單Cell-> Delete All Output,複製結果(Ctrl -A,C),並將結果粘貼到純文本編輯器中進行保存。一旦你掌握了它,它會花費驚人的時間。

1

那麼,我的解決方案不是使用Notebook進行跟蹤,而是使用純文本文件(而不是「Notebook」純文本)。

只要有筆記本,您可以使用「另存爲...」菜單將當前文件保存爲純文本文件。當你需要加載時,只需用Mahthematica打開即可。跟蹤此文件將比跟蹤Notebook文件好得多。我不確定使用純文本格式而不是Mathematica Notebook可能會失去哪些功能,但到目前爲止我還沒有發現任何缺陷。

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

10

沒有爲如何使用的Git在Mathematica Stack Exchange做版本控制使用Mathematica一套很好的建議。簡而言之,理念是儘量減少.nb筆記本的使用,並嘗試使用.m包(類似於上面的xuhdev和MMA用戶所說的)來執行大部分版本控制。考慮到筆記本電腦的管理方式,這似乎相當明智。

1

一種新的可能性是使用mathematica-notebook-filter來分析Mathematica筆記本電腦,並去除所有輸出單元和元數據,以便它們不會被提交到版本控制系統中。

在git的特定情況下,集成mathematica-notebook-filter非常簡單,以便git在通過使用gitattribute filters計算差異時自動清除輸出和元數據。您將需要安裝mathematica-notebook-filter過濾器,並添加到您的路徑變量(或適應下面點到二進制配置)和下面的行添加到您的~/.gitattributes文件:

*.nb filter=dropoutput_nb 

這指示混帳解析所有文件與在定義dropoutput_nb器的匹配*.nb~/.gitconfig爲:

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

如果由於某種原因,你想有一個特定的Mathematica筆記本致力於與所有的輸出和元數據,您可以禁用該項目的過濾器.gitattributes文件中加入:

notebook_file.nb !filter 

免責聲明:我是這個工具的作者。它是開放源碼和反饋(好的和壞的)都是值得讚賞的。 貢獻歡迎Github