Quelle est la bonne stratégie pour garder les blocs-notes IPython sous contrôle de version?
Le format du notebook est tout à fait adapté au contrôle de version: si l'on veut contrôler la version du notebook et des sorties, cela fonctionne très bien. L'ennui vient quand on veut seulement contrôler la version de l'entrée, à l'exclusion des sorties de cellule (aka. "Construire des produits") qui peuvent être de gros blobs binaires, en particulier pour les films et les intrigues. En particulier, j'essaie de trouver un bon flux de travail qui:
- me permet de choisir entre inclure ou exclure la sortie,
- m'empêche de commettre accidentellement une sortie si je ne le veux pas,
- me permet de conserver la sortie dans ma version locale,
- me permet de voir quand j'ai des changements dans les entrées en utilisant mon système de contrôle de version (c'est-à-dire si je ne contrôle que la version des entrées mais que mon fichier local a des sorties, alors je voudrais pouvoir voir si les entrées ont changé (nécessitant une validation L'utilisation de la commande d'état du contrôle de version enregistrera toujours une différence puisque le fichier local a des sorties.)
- me permet de mettre à jour mon cahier de travail (qui contient la sortie) à partir d'un cahier propre mis à jour. (mise à jour)
Comme mentionné, si j'ai choisi d'inclure les sorties (ce qui est souhaitable lors de l'utilisation de nbviewer par exemple), alors tout va bien. Le problème est quand je ne veux pas contrôler la version de la sortie. Il existe des outils et des scripts pour supprimer la sortie du bloc-notes, mais je rencontre fréquemment les problèmes suivants:
- Je valide accidentellement une version avec la sortie, polluant ainsi mon référentiel.
- J'efface la sortie pour utiliser le contrôle de version, mais je préfère vraiment garder la sortie dans ma copie locale (parfois cela prend un certain temps pour se reproduire par exemple).
- Certains des scripts qui suppriment la sortie modifient légèrement le format par rapport à l'
Cell/All Output/Clear
option de menu, créant ainsi du bruit indésirable dans les diffs. Ceci est résolu par certaines des réponses. - Lors de l'extraction de modifications dans une version propre du fichier, je dois trouver un moyen d'incorporer ces modifications dans mon cahier de travail sans avoir à tout relancer. (mise à jour)
J'ai examiné plusieurs options que j'examinerai ci-dessous, mais je n'ai pas encore trouvé de bonne solution globale. Une solution complète peut nécessiter certaines modifications d'IPython, ou peut s'appuyer sur des scripts externes simples. J'utilise actuellement mercurial , mais j'aimerais une solution qui fonctionne également avec git : une solution idéale serait l'agnostic de contrôle de version.
Ce problème a été discuté à plusieurs reprises, mais il n'y a pas de solution définitive ou claire du point de vue de l'utilisateur. La réponse à cette question devrait fournir la stratégie définitive. C'est bien si cela nécessite une version récente (même de développement) d' IPython ou une extension facilement installée.
Mise à jour: j'ai joué avec ma version de bloc-notes modifiée qui enregistre éventuellement une .clean
version à chaque sauvegarde en utilisant les suggestions de Gregory Crosswhite . Cela satisfait la plupart de mes contraintes mais laisse les éléments suivants non résolus:
- Ce n'est pas encore une solution standard (nécessite une modification de la source ipython. Existe-t-il un moyen d'obtenir ce comportement avec une simple extension? A besoin d'une sorte de hook de sauvegarde.
- Un problème que j'ai avec le flux de travail actuel tire des modifications. Ceux-ci viendront dans le
.clean
fichier, et devront ensuite être intégrés d'une manière ou d'une autre dans ma version de travail. (Bien sûr, je peux toujours réexécuter le bloc-notes, mais cela peut être pénible, surtout si certains des résultats dépendent de longs calculs, de calculs parallèles, etc.) Je n'ai pas encore une bonne idée de la façon de résoudre ce problème . Peut-être qu'un flux de travail impliquant une extension comme ipycache pourrait fonctionner, mais cela semble un peu trop compliqué.
Remarques
Suppression (suppression) de sortie
- Lorsque le portable est en cours d'exécution, on peut utiliser l'
Cell/All Output/Clear
option de menu pour supprimer la sortie. - Il existe certains scripts pour supprimer la sortie, tels que le script nbstripout.py qui supprime la sortie, mais ne produit pas la même sortie que l'utilisation de l'interface du bloc-notes. Cela a finalement été inclus dans le dépôt ipython / nbconvert , mais cela a été fermé indiquant que les modifications sont maintenant incluses dans ipython / ipython , mais la fonctionnalité correspondante ne semble pas encore avoir été incluse. (mise à jour) Cela étant dit, la solution de Gregory Crosswhite montre que c'est assez facile à faire, même sans invoquer ipython / nbconvert, donc cette approche est probablement réalisable si elle peut être correctement connectée.
Groupes de discussion
Problèmes
- 977: demandes de fonctionnalité de bloc-notes (ouvert) .
- 1280: option Effacer tout lors de la sauvegarde (Ouvrir) . (Suite de cette discussion .)
- 3295: blocs-notes exportés automatiquement: exportez uniquement les cellules marquées explicitement (Fermé) . Résolu par l'extension 11 Ajoutez la magie écrite et exécutée (fusionnée) .
Demandes de tirage
- 1621: effacer Dans [] les numéros d'invite sur "Effacer toutes les sorties" (fusionnées) . (Voir aussi 2519 (fusionné) .)
- 1563: améliorations de clear_output (fusionnées) .
- 3065: diff-capacité des cahiers (fermé) .
- 3291: ajoutez l'option pour ignorer les cellules de sortie lors de l'enregistrement. (Fermé) . Cela semble extrêmement pertinent, mais a été clôturé avec la suggestion d'utiliser un filtre "nettoyer / tacher". Une question pertinente que pouvez-vous utiliser si vous souhaitez supprimer la sortie avant d'exécuter git diff? ne semble pas avoir été répondu.
- 3312: WIP: hooks de sauvegarde de l'ordinateur portable (fermé) .
- 3747: ipynb -> transformateur ipynb (fermé) . Ceci est rebasé en 4175 .
- 4175: nbconvert: base d'exportateurs Jinjaless (fusionnée) .
- 142: Utilisez STDIN dans nbstripout si aucune entrée n'est donnée (Open) .
--script
option, mais elle a été supprimée. J'attends jusqu'à ce que les hooks post-sauvegarde soient implémentés ( qui sont prévus ) à quel point je pense que je serai en mesure de fournir une solution acceptable combinant plusieurs des techniques.