IPythonノートブックをバージョン管理下に置くための良い戦略は何ですか?
ノートブックの形式はバージョン管理に非常に適しています。ノートブックと出力をバージョン管理したい場合、これは非常にうまく機能します。特に映画やプロットの場合、大きなバイナリblobになる可能性のあるセル出力(別名「ビルドプロダクト」)を除いて、入力のバージョン管理のみを行いたい場合に問題が発生します。特に、次のような優れたワークフローを見つけようとしています。
- 出力を含めるか除外するかを選択できます
- 不要な出力を誤ってコミットするのを防ぎます。
- ローカルバージョンで出力を保持できます。
- バージョン管理システムを使用して入力に変更があるかどうかを確認できます(つまり、バージョン管理のみで入力がローカルファイルに出力がある場合、入力が変更されたかどうかを確認できます(コミットが必要) )ローカルファイルには出力があるため、バージョン管理ステータスコマンドを使用すると、常に差異が登録されます。
- 更新されたクリーンなノートブックから作業用ノートブック(出力を含む)を更新できます。(更新)
前述のように、出力を含めることを選択した場合(たとえば、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マジック(マージ)を追加。
プルリクエスト
- 1621:[すべての出力をクリア]のIn []プロンプト番号をクリア(マージ)。(2519(マージ済み)も参照してください。)
- 1563:clear_outputの改善(マージ)。
- 3065:ノートブックのdiff-ability(クローズ)。
- 3291:保存時に出力セルをスキップするオプションを追加します。(定休日)。これは非常に関連があるようですが、「クリーン/スマッジ」フィルターを使用するよう提案されたため、クローズされました。関連する質問git diffを実行する前に出力を削除したい場合、何を使用できますか?答えられていないようです。
- 3312:WIP:Notebook save hooks(Closed)。
- 3747:ipynb-> ipynbトランスフォーマー(クローズ)。これは4175でリベースされました。
- 4175:nbconvert:Jinjalessエクスポーターベース(マージ済み)。
- 142:入力がない場合(オープン)は、nbstripoutでSTDINを使用します。
--script
オプションで行くつもりでしたが、それは削除されました。保存後のフックが実装される(計画されている)まで待っています。その時点で、いくつかの手法を組み合わせて許容できるソリューションを提供できると思います。