もちろん、Mathematicaノートブックはプレーンテキストファイルです。バージョン管理システム(私の場合はgitですが、特定のシステムが重要かどうかは疑わしいですが)でNiceを再生することを期待するのは妥当なようです。ただし、実際には、.nbファイルには、キャッシュ情報、タイムスタンプ、およびその他のさまざまなメタデータがいっぱいです。それのスカッド。
つまり、制限付きのバージョン管理が可能です。コミットとロールバックは正常に機能します。ただし、マージは災害です。 Mathematicaはマージマーカーを含むファイルを開かず、テキストエディタは.nbファイルを調べる方法ではありません。
ノートブックをバージョン管理下に置く運があった人はいますか?どうやって?
ファイルアウトラインキャッシュを無効にすることをお勧めします。これは、テキストエディタでノートブックを表示するときに参照するメタデータです。ご存知のように、複数の関係者が同じノートブックを編集している場合、マージの競合が発生する可能性があります。
これは、オプションインスペクターで簡単に無効にできます。 MathematicaメニューでFormat→Option Inspector ...に移動し、左上のscopeドロップダウンをノートブックを選択し、検索フィールドでFileOutlineCache
を検索します。オプションをFalseに設定してノートブックを保存すると、すべて設定されているはずです。
これにより、ノートブックを開くのが少し遅くなる可能性がありますが、ノートブックがかなり大きくない限り、おそらく違いに気付かないことに注意してください。
Mathematica Stack Exchange で、Gitを使用してMathematicaでバージョン管理を行う方法についての一連の素晴らしい推奨事項があります。要するに、哲学は.nbノートブックの使用を最小限に抑え、バージョン管理のほとんどを.mパッケージで実行しようとすることです(上記のxuhdevおよびMMAユーザーの発言と同様)。ノートブックの管理方法を考えると、これは非常に賢明なようです。
マージの問題を正確に解決するわけではありませんが、これが私のチームでノートブックとソース管理を処理する方法です。基本的に、Mathematicaノートブックはバイナリファイルと同じように扱います。チェックインされていますが、次のようになります。
私たちは主に小さな証明、探索、サイドトラックにMathematicaを使用しているので、上記の手順はうまくいきます(私たちの主なドキュメントはLaTeXにあり、非数学者/非プログラマーのためのよりフレンドリーなドキュメントを作成します)
SimonとKenaが言っていたことに沿って、Mathematica .nbをバージョン管理下に置いたとき、私はしばしば入力コードのみのプレーンテキストバージョンを作成し、同じ名前で.txt拡張子を付けて保存します。これはマージの問題を直接解決するわけではありませんが、差分が合理的な方法で機能し、後で.nbを編集するために戻ったときに手動でのマージがより明確になります。この形式にはまだいくつかの特異性がありますが、生の.nb形式よりもはるかに読みやすくなっています。
テキストファイルを生成するには、ノートブックを新しい空白のノートブックにコピーし(ショートカット、Ctrl-A、C、N、Vを使用)、メニューの[セル]-> [すべての出力を削除]を選択し、結果をコピーします(Ctrl-A、C )、結果をプレーンテキストエディタに貼り付けて保存します。一度コツをつかめば、驚くほど短い時間で済みます。
新しい可能性は mathematica-notebook-filter
を使用することです。これはMathematicaノートブックを解析し、すべての出力セルとメタデータを取り除き、これらがバージョン管理システムにコミットされないようにします。
Gitの特定のケースでは、 mathematica-notebook-filter
を統合するのは非常に簡単です。そのため、gitは gitattributeフィルター を使用して差分を計算するときに出力とメタデータを自動的にクリーンアップします。 mathematica-notebook-filter
フィルターをインストールしてパス変数に追加し(または以下の構成をバイナリを指すように調整し)、次の行を~/.gitattributes
ファイルに追加する必要があります。 :
*.nb filter=dropoutput_nb
これは、*.nb
で次のように定義されているdropoutput_nb
フィルターを使用して~/.gitconfig
に一致するすべてのファイルを解析するようにgitに指示します。
[filter "dropoutput_nb"]
clean = mathematica-notebook-filter
smudge = cat
何らかの理由で、特定のMathematicaノートブックをすべての出力とメタデータでコミットしたい場合は、以下を追加することでプロジェクトの.gitattributes
ファイルのフィルターを無効にすることができます。
notebook_file.nb !filter
免責事項:私はこのツールの作成者です。それはオープンソースであり、フィードバック(良いものと悪いものの両方)が高く評価されています。 Github での投稿を歓迎します。
私の解決策は、追跡にノートブックを使用するのではなく、プレーンテキストファイル(「ノートブック」のプレーンテキストではない)を使用することです。
ノートブックをお持ちの場合は、[名前を付けて保存...]メニューを使用して、現在のファイルをプレーンテキストファイルとして保存できます。ロードする必要がある場合は、Mahthematicaで開くだけです。このファイルを追跡することは、ノートブックファイルを追跡するよりもはるかに優れています。 Mathematicaノートブックではなくプレーンテキスト形式を使用することでどのような機能が失われるかはわかりませんが、これまでのところ欠陥は見つかりませんでした。
参照: http://www.topbug.net/blog/2013/05/02/track-mathematica-source-files-with-version-control-systems/
ソース管理システムが複数のユーザーによる単一行への変更を検出した場合にのみ、マージマーカーを取得する必要があります。
ソース管理システムはマーカーを追加して、競合がどこにあるかを非常に明確にし、(各競合を解決するときに)手動で削除するように強制します。ソース管理システムが自動的にそれを行う方法を知る方法はありません。
ファイルがテキストであるが、プログラムによってのみ読み取られるように設計されている場合は、行末文字がまったくない(または非常に長い行)可能性があります。したがって、複数の人がそのようなファイルで作業している場合、多くのマージの競合が発生します。
私はnbファイル形式に精通していませんが、一般にこの問題の解決策は、一度に1人だけがファイルで作業していることを確認することです(つまり、nbファイルに専用のチェックアウトモードを使用します)。