À l'aide de IPython cahiers sous contrôle de version

Ce qui est une bonne stratégie pour garder IPython cahiers sous contrôle de version?

L'ordinateur portable de format est tout à fait prête pour le contrôle de version: si l'on veut contrôler la version portable et les sorties alors cela fonctionne très bien. La gêne vient lorsque l'on cherche à contrôler la version d'entrée, à l'exclusion de la cellule sorties (aka. "produits de construction"), qui peuvent être de taille des blobs binaires, en particulier pour les films et les parcelles. En particulier, je suis en train d'essayer de trouver un bon flux de travail:

  • me permet de choisir entre inclusion ou d'exclusion de sortie,
  • m'empêche de me accidentellement commettre de sortie si je ne le veux pas,
  • me permet de garder de sortie dans ma version locale,
  • me permet de voir quand j'ai des modifications dans les entrées à l'aide de mon système de contrôle de version (c'est à dire si je n'ai que la version de contrôler les entrées, mais mon fichier local sorties, alors je voudrais être en mesure de voir si les entrées ont changé (nécessitant une validation). À l'aide de la version de l'état de contrôle de commande enregistrez toujours une différence depuis le fichier local a sorties.)
  • me permet de mettre à jour mon ordinateur portable (qui contient la sortie) à partir d'une mise à jour propre ordinateur portable. (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 pas souhaitez contrôler la version de sortie. Il ya quelques outils et scripts pour le décapage de la sortie de l'ordinateur portable, mais souvent, je rencontre les problèmes suivants:

  1. J'ai accidentellement commettre une version avec le la sortie, et ainsi de polluer mon référentiel.
  2. Je clair de sortie à utiliser le contrôle de version, mais il serait vraiment plutôt de maintenir la sortie dans ma copie locale (parfois, il faut un certain temps pour reproduire par exemple).
  3. Certains des scripts de sortie de la bande de changer le format légèrement par rapport à la Cell/All Output/Clear option de menu, créant de ce fait un bruit indésirable dans les diffs. Ce problème est résolu par certaines réponses.
  4. Lors de l'extraction de changements vers une nouvelle version du fichier, j'ai besoin de trouver un moyen d'intégrer ces changements dans mon travail portable sans refaire tout.
    (mise à jour)

J'ai examiné plusieurs options que je vais développer ci-dessous, mais n'ai pas encore trouvé une bonne solution complète. Une solution complète peut nécessiter quelques modifications pour le IPython, ou peut s'appuyer sur de simples scripts externes. J'utilise actuellement mercurial, mais je voudrais une solution qui fonctionne également avec les git: une solution idéale serait de contrôle de version agnostique.

Cette question a été débattue à plusieurs reprises, mais il n'est pas définitive ou de solution claire à partir de la perspective de l'utilisateur. La réponse à cette question devrait permettre d'définitive de la stratégie. Il est très bien si elle nécessite une étude récente (même développement) version de IPython ou un facilement installé l'extension.

Mise à jour: j'ai été jouer avec mon modifiée portable version qui éventuellement enregistre une .clean version avec tous les enregistrer à l'aide de Gregory Crosswhite suggestions. Cela répond à la plupart de mes contraintes, mais laisse la suite en suspens:

  1. Ce n'est pas encore une solution standard (nécessite une modification de la ipython source. Est-il un moyen de parvenir à ce comportement avec une simple extension? Besoin d'une forme de sur-save crochet.
  2. Un problème que j'ai avec le flux de travail actuel est en tirant les changements. Ceux-ci seront de la .clean fichier, et doivent ensuite être intégré en quelque sorte, dans ma version de travail. (Bien sûr, je peux toujours ré-exécuter le bloc-notes, mais cela peut être une douleur, surtout si certaines de ces résultats dépendent de longs calculs, des calculs parallèles, etc.) Je n'ai pas une bonne idée sur la façon de résoudre ce encore. Peut-être un flux de travail impliquant une extension comme ipycache pourrait fonctionner, mais cela semble un peu trop compliqué.

Notes

Retrait (décapage) Sortie

  • Lorsque l'ordinateur portable est en cours d'exécution, on peut utiliser le Cell/All Output/Clear option de menu pour supprimer la sortie.
  • Il y a quelques scripts pour la suppression de la production, comme le script nbstripout.py qui suppriment la sortie, mais ne produit pas le même résultat que l'utilisation de l'ordinateur portable de l'interface. Cela a finalement été inclus dans l' ipython/nbconvert repo, mais cela a été fermé indiquant que les changements sont maintenant inclus dans ipython/ipython,mais la fonctionnalité correspondante ne semble pas avoir été encore comprises. (mise à jour) cela étant dit, Gregory Crosswhite de la solution montre que c'est assez facile à faire, même sans invoquer ipython/nbconvert, de sorte que cette approche est probablement réalisable s'il peut être bien accroché. (En l'attachant à chaque système de contrôle de version, cependant, ne semble pas être une bonne idée — ce qui devrait en quelque sorte de crochet dans le cahier mécanisme.)

Groupes de discussion

Questions

Pull Requests

  • Sonne comme une grande chose à ajouter une question sur github.com/ipython/ipython ou de soumettre une demande d'extraction qui vous aide à poursuivre cet objectif.
  • Comme vous pouvez le voir, il y a déjà pléthore de PR et les questions relatives à cet objectif. Une fois résolu (à savoir PR 4175), puis une réponse définitive devrait être disponible mais sera probablement impliquer certains de création de scripts supplémentaires à l'extérieur de IPython (git ou hg crochets, par exemple). Donc, je ne pense pas qu'il y aura rien gagné par l'ajout d'un nouveau PR ou d'une question.
  • Ouais, leur développement est en mouvement rapide et constante de tous les jours. Les devs sont bonnes gens bien (et qui ont probablement lu cette publication). Je sais que je veux un simple flux de travail pour travailler avec git.
  • Je l'ai fait aussi mention sur la liste de diffusion. Il ressemble à PR 4175 sera résolu en quelques heures/jours donc je m'attends à ce déplacer rapidement.
  • Une fois que vous avez un travail de script pour supprimer la sortie, vous pouvez utiliser un Git "propre" filtre à appliquer automatiquement avant de s'engager (voir nettoyage/tacher de filtres).
  • Toutes les réponses sont contenues dans la question! @mforbes, c'est bien de répondre à votre propre question, mais mieux si vous pouvez mettre les réponses dans une réponse.
  • La question contient insatisfaisant solutions de contournement: chacun a au moins une limitation. Maintenant que PR 4175 a été fusionné, une solution complète qui peut probablement être formulées, mais cela doit encore être fait. Dès que j'ai le temps, je vais le faire (comme réponse) si quelqu'un d'autre ne fournit pas une solution satisfaisante dans le temps.
  • Juste assez. Hâte d'être à la solution, je vais probablement l'utiliser.
  • Une autre solution partielle: un filtre pour git qui affiche nettoyeur de diffs, mais encore valide la réelle cahiers entiers et non modifiée: gist.github.com/takluyver/bc8f3275c7d34abb68bf
  • Très bonne question, mais je ne vois pas accepté de répondre. Quelles réponses avez-vous essayé? Est-il une solution recommandée?
  • Je n'ai pas encore trouvé une solution recommandée: j'allais y aller avec la --script option, mais qui a été supprimé. Je suis en attente jusqu'à ce que la post-enregistrer les crochets sont mis en œuvre (qui sont prévus), là je pense que je vais être en mesure de fournir une solution acceptable la combinaison de plusieurs de ces techniques.
  • Il ressemble à IPython est proche. Une fois PR 6896 est acceptée, alors nous devrions être en mesure de résoudre cette question par le biais de pré-et post-enregistrer les crochets.
  • Dirait que le PR était juste fusionné quelques jours après votre commentaire. Pourriez-vous ou quelqu'un de plus compétent que moi pour poster une réponse ici, qui montre comment utiliser la nouvelle fonctionnalité?
  • Je vais par la suite, mais je suis un peu débordé dès maintenant. Peut-être quelqu'un va me battre pour elle!
  • Je viens d'ajouter une réponse
  • N'est-ce pas la meilleure solution PR de github juste changer le diff outil pour le cas particulier de cahier des diffs et seulement de montrer les diff des cellules d'entrée? Ensuite, vous obtenez toujours la sortie sauvé et rendu sur GitHub, ce qui est une grande fonctionnalité utile de carnets de notes.

InformationsquelleAutor mforbes | 2013-09-11