Was ist eine gute Strategie, um IPython- Notebooks unter Versionskontrolle zu halten?
Das Notebook-Format eignet sich gut für die Versionskontrolle: Wenn man das Notebook und die Ausgänge versionieren möchte, funktioniert dies recht gut. Der Ärger entsteht, wenn man nur die Version der Eingabe steuern möchte, mit Ausnahme der Zellenausgaben (auch "Build-Produkte" genannt), bei denen es sich um große binäre Blobs handeln kann, insbesondere für Filme und Handlungen. Insbesondere versuche ich, einen guten Workflow zu finden, der:
- ermöglicht mir die Wahl zwischen Einschließen oder Ausschließen von Ausgaben,
- verhindert, dass ich versehentlich eine Ausgabe festschreibe, wenn ich es nicht will,
- ermöglicht es mir, die Ausgabe in meiner lokalen Version zu behalten,
- ermöglicht es mir zu sehen, wann ich Änderungen an den Eingaben mit meinem Versionskontrollsystem habe (dh wenn ich nur die Eingaben versioniere, aber meine lokale Datei Ausgaben hat, möchte ich in der Lage sein zu sehen, ob sich die Eingaben geändert haben (was ein Commit erfordert) ) Bei Verwendung des Versionskontrollstatusbefehls wird immer ein Unterschied registriert, da die lokale Datei Ausgänge hat.)
- ermöglicht es mir, mein Arbeitsnotizbuch (das die Ausgabe enthält) von einem aktualisierten sauberen Notizbuch zu aktualisieren. (aktualisieren)
Wie bereits erwähnt, ist alles in Ordnung , wenn ich die Ausgaben einbeziehe (was beispielsweise bei Verwendung von nbviewer wünschenswert ist). Das Problem ist, wenn ich die Ausgabe nicht versionieren möchte. Es gibt einige Tools und Skripte zum Entfernen der Ausgabe des Notebooks, aber häufig treten die folgenden Probleme auf:
- Ich habe versehentlich eine Version mit der Ausgabe festgeschrieben, wodurch mein Repository verschmutzt wird.
- Ich lösche die Ausgabe, um die Versionskontrolle zu verwenden, möchte die Ausgabe jedoch lieber in meiner lokalen Kopie behalten (manchmal dauert die Reproduktion beispielsweise eine Weile).
- Einige der Skripte, die die Ausgabe
Cell/All Output/Clear
entfernen, ändern das Format im Vergleich zur Menüoption geringfügig , wodurch unerwünschte Störungen in den Diffs entstehen. Dies wird durch einige der Antworten gelöst. - Wenn ich Änderungen an einer sauberen Version der Datei abrufe, muss ich eine Möglichkeit finden, diese Änderungen in mein Arbeitsnotizbuch aufzunehmen, ohne alles erneut ausführen zu müssen. (aktualisieren)
Ich habe einige Optionen in Betracht gezogen, die ich unten diskutieren werde, habe aber noch keine gute umfassende Lösung gefunden. Eine vollständige Lösung erfordert möglicherweise einige Änderungen an IPython oder basiert auf einfachen externen Skripten. Ich verwende derzeit Mercurial , möchte aber eine Lösung, die auch mit Git funktioniert : Eine ideale Lösung wäre Agnostic mit Versionskontrolle.
Dieses Problem wurde schon oft diskutiert, aber aus Sicht des Benutzers gibt es keine endgültige oder klare Lösung. Die Antwort auf diese Frage sollte die endgültige Strategie liefern. Es ist in Ordnung, wenn eine aktuelle (sogar Entwicklungs-) Version von IPython oder eine einfach zu installierende Erweiterung erforderlich ist .
Update: Ich habe mit meiner modifizierten Notebook- Version gespielt, die optional .clean
bei jedem Speichern eine Version mit den Vorschlägen von Gregory Crosswhite speichert . Dies erfüllt die meisten meiner Einschränkungen, lässt jedoch Folgendes ungelöst:
- Dies ist noch keine Standardlösung (erfordert eine Änderung der Ipython-Quelle. Gibt es eine Möglichkeit, dieses Verhalten mit einer einfachen Erweiterung zu erreichen? Benötigt eine Art On-Save-Hook.
- Ein Problem, das ich mit dem aktuellen Workflow habe, ist das Abrufen von Änderungen. Diese werden in die
.clean
Datei aufgenommen und müssen dann irgendwie in meine Arbeitsversion integriert werden. (Natürlich kann ich das Notizbuch jederzeit erneut ausführen, aber dies kann schmerzhaft sein, insbesondere wenn einige der Ergebnisse von langen Berechnungen, parallelen Berechnungen usw. abhängen.) Ich habe noch keine gute Idee, wie dies behoben werden kann . Vielleicht funktioniert ein Workflow mit einer Erweiterung wie ipycache , aber das scheint etwas zu kompliziert.
Anmerkungen
Ausgang entfernen (entfernen)
- Wenn das Notebook läuft, können Sie die
Cell/All Output/Clear
Menüoption zum Entfernen der Ausgabe verwenden. - Es gibt einige Skripte zum Entfernen der Ausgabe, z. B. das Skript nbstripout.py, das die Ausgabe entfernt, jedoch nicht die gleiche Ausgabe wie bei Verwendung der Notebook-Oberfläche erzeugt. Dies wurde schließlich in das Repo von ipython / nbconvert aufgenommen , aber dies wurde geschlossen, da die Änderungen jetzt in ipython / ipython enthalten sind, die entsprechende Funktionalität jedoch noch nicht enthalten zu sein scheint. (Update) That being said, Gregory Crosswhite-Lösung zeigt , dass dies recht einfach zu tun, auch ohne Berufung auf ipython / nbconvertDaher ist dieser Ansatz wahrscheinlich praktikabel, wenn er ordnungsgemäß angeschlossen werden kann. (Das Anschließen an jedes Versionskontrollsystem scheint jedoch keine gute Idee zu sein - dies sollte sich irgendwie in den Notebook-Mechanismus einfügen.)
Newsgroups
Probleme
- 977: Anforderungen an Notebook-Funktionen (offen) .
- 1280: Option "Alles beim Speichern löschen" (Öffnen) . (Folgt aus dieser Diskussion .)
- 3295: Autoexportierte Notizbücher: Exportieren Sie nur explizit markierte Zellen (geschlossen) . Gelöst durch Erweiterung 11 Add writeandexecute magic (Merged) .
Anfragen ziehen
- 1621: clear In [] Eingabeaufforderungsnummern bei "Clear All Output" (Zusammengeführt) . (Siehe auch 2519 (zusammengeführt) .)
- 1563: clear_output Verbesserungen (zusammengeführt) .
- 3065: Diff-Fähigkeit von Notebooks (geschlossen) .
- 3291: Fügen Sie die Option hinzu, um Ausgabezellen beim Speichern zu überspringen. (Geschlossen) . Dies scheint äußerst relevant zu sein, wurde jedoch mit dem Vorschlag abgeschlossen, einen "Clean / Smudge" -Filter zu verwenden. Eine relevante Frage, was können Sie verwenden, wenn Sie die Ausgabe entfernen möchten, bevor Sie git diff ausführen? scheint nicht beantwortet worden zu sein.
- 3312: WIP: Notebook-Speicherhaken (geschlossen) .
- 3747: ipynb -> ipynb-Transformator (geschlossen) . Dies wird in 4175 neu basiert .
- 4175: nbconvert: Jinjaless-Exportbasis (zusammengeführt) .
- 142: Verwenden Sie STDIN in nbstripout, wenn keine Eingabe erfolgt (Open) .
--script
Option entscheiden, aber die wurde entfernt. Ich warte, bis Post-Save-Hooks implementiert sind ( die geplant sind ). An diesem Punkt denke ich, dass ich in der Lage sein werde, eine akzeptable Lösung bereitzustellen, die mehrere der Techniken kombiniert.