IPythonノートブックをバージョン管理下に置くための良い戦略は何ですか?
ノートブック形式は、バージョン管理に非常に適しています。ノートブックと出力をバージョン管理したい場合、これは非常にうまく機能します。特に映画やプロットの場合、大きなバイナリブロブになる可能性があるセル出力(別名「ビルド製品」)を除外して、入力のバージョン管理のみを行いたい場合に煩わしさが生じます。特に、次のような優れたワークフローを見つけようとしています。
- 出力を含めるか除外するかを選択できます。
- 必要のない出力を誤ってコミットするのを防ぎます。
- 出力をローカル バージョンに保持できるようにする
- バージョン管理システムを使用して、入力にいつ変更があったかを確認できます (つまり、入力のみをバージョン管理し、ローカル ファイルに出力がある場合、入力が変更されたかどうかを確認できるようにしたいと考えています (コミットが必要です) ) バージョン管理ステータス コマンドを使用すると、ローカル ファイルに出力があるため、常に違いが登録されます。)
- 更新されたクリーンなノートブックから作業中のノートブック (出力を含む) を更新できます。(アップデート)
前述のように、出力を含めることを選択した場合 (たとえば、 nbviewerを使用する場合に望ましい)、すべて問題ありません。問題は、出力をバージョン管理したくない場合です。ノートブックの出力を削除するためのツールとスクリプトがいくつかありますが、次の問題が頻繁に発生します。
- 誤ってバージョンを出力でコミットしたため、リポジトリが汚染されました。
- バージョン管理を使用するために出力をクリアしますが、実際には出力をローカル コピーに保持したいと考えています (たとえば、再現に時間がかかる場合があります)。
- 出力を削除するスクリプトの一部は、
Cell/All Output/Clear
メニュー オプションと比較して形式をわずかに変更するため、差分に不要なノイズが発生します。これは、いくつかの回答によって解決されます。 - 変更をファイルのクリーン バージョンにプルする場合、すべてを再実行することなく、それらの変更を作業ノートブックに組み込む方法を見つける必要があります。 (アップデート)
以下で説明するいくつかのオプションを検討しましたが、まだ優れた包括的な解決策を見つけていません。完全なソリューションでは、IPython にいくつかの変更が必要になるか、いくつかの単純な外部スクリプトに依存する場合があります。私は現在mercurialを使用していますが、 gitでも機能するソリューションが必要です。理想的なソリューションは、バージョン管理に依存しないものです。
この問題は何度も議論されてきましたが、ユーザーの観点から決定的または明確な解決策はありません。この質問に対する答えは、決定的な戦略を提供する必要があります。IPythonの最新の (開発段階であっても) バージョンまたは簡単にインストールできる拡張機能が必要な場合は問題ありません。
更新: Gregory Crosswhite の提案を使用して、保存するたびにオプションでバージョンを保存する変更されたノートブックバージョンで遊んでいます。これは私の制約のほとんどを満たしていますが、次の未解決のままです。.clean
- これはまだ標準的な解決策ではありません (ipython ソースの変更が必要です。単純な拡張機能でこの動作を実現する方法はありますか? 何らかの保存時のフックが必要です。
- 現在のワークフローで私が抱えている問題は、変更をプルすることです。これらは
.clean
ファイルに入り、作業中のバージョンに何らかの方法で統合する必要があります。(もちろん、いつでもノートブックを再実行できますが、特に結果の一部が長い計算や並列計算などに依存している場合、これは苦痛になる可能性があります) これを解決する方法についてまだ良い考えがありません. おそらく、ipycacheのような拡張機能を含むワークフローが機能する可能性がありますが、それは少し複雑すぎるようです。
ノート
出力の削除 (ストリッピング)
- ノートブックが実行されている場合、
Cell/All Output/Clear
メニュー オプションを使用して出力を削除できます。 - 出力を削除するスクリプトnbstripout.pyなど、出力を削除するためのスクリプトがいくつかありますが、ノートブック インターフェイスを使用した場合と同じ出力は生成されません。これは最終的に ipython/nbconvert リポジトリに含まれましたが、変更が現在ipython/ipythonに含まれていることを示してクローズされていますが、対応する機能はまだ含まれていないようです。 (更新)そうは言っても、Gregory Crosswhite のソリューションは、 ipython/nbconvertを呼び出さなくても、これが非常に簡単であることを示しています。であるため、適切にフックできれば、このアプローチはおそらく実行可能です。
ニュースグループ
問題
- 977: ノートブック機能のリクエスト (オープン)。
- 1280: 保存オプションですべてクリア (開く)。(このディスカッションから続きます。)
- 3295: 自動エクスポートされたノートブック: 明示的にマークされたセルのみをエクスポートします (クローズ) . 拡張機能11 で解決 writeandexecute マジック (Merged) を追加します。
プルリクエスト
- 1621: 「Clear All Output」(Merged) で In[] プロンプト番号をクリアします。( 2519 (合併)も参照のこと。)
- 1563: clear_output の改善 (マージ) .
- 3065: ノートブックの差分機能 (終了) .
- 3291: 保存時に出力セルをスキップするオプションを追加します。(閉店) . これは非常に関連性が高いようですが、「クリーン/スマッジ」フィルターを使用するよう提案されてクローズされました。関連する質問git diff を実行する前に出力を取り除きたい場合、何を使用できますか? 回答されていないようです。
- 3312: WIP: ノートブック保存フック (終了) .
- 3747: ipynb -> ipynb トランスフォーマー (クローズ) . これは4175でリベースされています。
- 4175: nbconvert: Jinjaless exporter base (Merged) .
- 142: 入力が指定されていない場合は、nbstripout で STDIN を使用します (開く)。