Qual è una buona strategia per mantenere i notebook IPython sotto controllo della versione?
Il formato del notebook è abbastanza adatto per il controllo della versione: se si desidera controllare la versione del notebook e delle uscite, allora funziona abbastanza bene. Il fastidio arriva quando si vuole solo controllare la versione dell'ingresso, escludendo le uscite delle celle (ovvero "prodotti di costruzione") che possono essere grandi blocchi binari, specialmente per film e trame. In particolare, sto cercando di trovare un buon flusso di lavoro che:
- mi permette di scegliere tra includere o escludere l'output,
- mi impedisce di commettere accidentalmente output se non lo voglio,
- mi consente di mantenere l'output nella mia versione locale,
- mi permette di vedere quando ho cambiamenti negli input usando il mio sistema di controllo della versione (cioè se controllo solo gli input ma il mio file locale ha degli output, allora vorrei essere in grado di vedere se gli input sono cambiati (richiedendo un commit L'uso del comando status controllo versione registrerà sempre una differenza poiché il file locale ha output.)
- mi permette di aggiornare il mio taccuino funzionante (che contiene l'output) da un taccuino pulito aggiornato. (aggiornare)
Come accennato, se ho scelto di includere gli output (il che è desiderabile quando si utilizza nbviewer per esempio), allora va tutto bene. Il problema è quando non voglio controllare la versione dell'output. Esistono alcuni strumenti e script per rimuovere l'output del notebook, ma spesso riscontro i seguenti problemi:
- Commetto accidentalmente una versione con l'output, inquinando così il mio repository.
- Deseleziono l'output per utilizzare il controllo versione, ma preferirei piuttosto conservare l'output nella mia copia locale (a volte ci vuole un po 'di tempo per riprodurlo, ad esempio).
- Alcuni degli script che rimuovono l'output cambiano leggermente il formato rispetto
Cell/All Output/Clear
all'opzione di menu, creando così rumore indesiderato nelle differenze. Questo è risolto da alcune delle risposte. - Quando tengo le modifiche a una versione pulita del file, devo trovare un modo per incorporare quelle modifiche nel mio taccuino di lavoro senza dover rieseguire tutto. (aggiornare)
Ho preso in considerazione diverse opzioni di cui parlerò di seguito, ma devo ancora trovare una buona soluzione globale. Una soluzione completa potrebbe richiedere alcune modifiche a IPython o fare affidamento su alcuni semplici script esterni. Attualmente utilizzo mercurial , ma vorrei una soluzione che funzioni anche con git : una soluzione ideale sarebbe agnostica di controllo della versione.
Questo problema è stato discusso molte volte, ma non esiste una soluzione definitiva o chiara dal punto di vista dell'utente. La risposta a questa domanda dovrebbe fornire la strategia definitiva. Va bene se richiede una versione recente (anche di sviluppo) di IPython o un'estensione facilmente installabile.
Aggiornamento: sto giocando con la mia versione modificata del taccuino che salva facoltativamente una .clean
versione con ogni salvataggio usando i suggerimenti di Gregory Crosswhite . Ciò soddisfa la maggior parte dei miei vincoli ma lascia irrisolto quanto segue:
- Questa non è ancora una soluzione standard (richiede una modifica della sorgente ipython. Esiste un modo per ottenere questo comportamento con una semplice estensione? Ha bisogno di una sorta di hook on-save.
- Un problema che ho con l'attuale flusso di lavoro sta tirando le modifiche. Questi arriveranno nel
.clean
file e quindi dovranno essere integrati in qualche modo nella mia versione funzionante. (Certo, posso sempre rieseguire il notebook, ma questo può essere un problema, soprattutto se alcuni dei risultati dipendono da lunghi calcoli, calcoli paralleli, ecc.) Non ho ancora una buona idea su come risolverlo . Forse un flusso di lavoro che coinvolge un'estensione come ipycache potrebbe funzionare, ma sembra un po 'troppo complicato.
Appunti
Rimozione (stripping) dell'uscita
- Quando il notebook è in esecuzione, è possibile utilizzare l'
Cell/All Output/Clear
opzione di menu per rimuovere l'output. - Esistono alcuni script per la rimozione dell'output, come lo script nbstripout.py che rimuove l'output, ma non produce lo stesso output dell'interfaccia del notebook. Questo è stato infine incluso nel repository ipython / nbconvert , ma è stato chiuso affermando che le modifiche sono ora incluse in ipython / ipython , ma la funzionalità corrispondente sembra non essere stata ancora inclusa. (aggiornamento) Detto questo, la soluzione di Gregory Crosswhite mostra che questo è abbastanza facile da fare, anche senza invocare ipython / nbconvert, quindi questo approccio è probabilmente praticabile se può essere correttamente agganciato. (Collegarlo a ciascun sistema di controllo versione, tuttavia, non sembra una buona idea - questo dovrebbe in qualche modo collegarsi al meccanismo del notebook.)
Newsgroup
Problemi
- 977: richieste funzionalità notebook (Apri) .
- 1280: Cancella tutto su opzione di salvataggio (Apri) . (Segue da questa discussione .)
- 3295: notebook esportati automaticamente: esporta solo celle contrassegnate in modo esplicito (Chiuso) . Risolto dall'estensione 11 Aggiungi magia magica decisa (unita) .
Richieste pull
- 1621: cancella i numeri di richiesta [] su "Cancella tutto output" (unito) . (Vedi anche 2519 (unito) .)
- 1563: miglioramenti di clear_output (uniti) .
- 3065: diff-abilità dei notebook (chiuso) .
- 3291: aggiungere l'opzione per saltare le celle di output durante il salvataggio. (Chiuso) . Ciò sembra estremamente rilevante, tuttavia è stato chiuso con il suggerimento di utilizzare un filtro "pulito / sbavato". Una domanda rilevante che cosa puoi usare se vuoi eliminare l'output prima di eseguire git diff? sembra non aver ricevuto risposta.
- 3312: WIP: ganci di salvataggio per notebook (chiuso) .
- 3747: ipynb -> trasformatore ipynb (chiuso) . Questo è stato riformulato nel 4175 .
- 4175: nbconvert: base esportatore Jinjaless (fusa) .
- 142: Utilizzare STDIN in nbstripout se non viene fornito alcun input (Apri) .
--script
opzione, ma è stata rimossa. Sto aspettando che vengano implementati gli hook post-salvataggio ( che sono previsti ), a quel punto penso che sarò in grado di fornire una soluzione accettabile combinando molte delle tecniche.