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.Réponses:
Voici ma solution avec git. Il vous permet simplement d'ajouter et de valider (et de différer) comme d'habitude: ces opérations ne modifieront pas votre arborescence de travail, et en même temps (re) exécuter un notebook ne modifiera pas votre historique git.
Bien que cela puisse probablement être adapté à d'autres VCS, je sais que cela ne répond pas à vos exigences (au moins l'agnosticité VSC). Pourtant, il est parfait pour moi, et bien que ce ne soit rien de particulièrement brillant, et que beaucoup de gens l'utilisent probablement déjà, je n'ai pas trouvé d'instructions claires sur la façon de le mettre en œuvre en parcourant Google. Cela peut donc être utile à d'autres personnes.
~/bin/ipynb_output_filter.py
)chmod +x ~/bin/ipynb_output_filter.py
)Créez le fichier
~/.gitattributes
, avec le contenu suivantExécutez les commandes suivantes:
Terminé!
Limites:
somebranch
et que vous le faitesgit checkout otherbranch; git checkout somebranch
, vous vous attendez généralement à ce que l'arbre de travail soit inchangé. Ici, vous aurez perdu la sortie et la numérotation des cellules des blocs-notes dont la source diffère entre les deux branches.git commit notebook_file.ipynb
, même si cela permettrait au moins de segit diff notebook_file.ipynb
débarrasser des ordures de base64).Ma solution reflète le fait que personnellement je n'aime pas garder les éléments générés versionnés - notez que faire des fusions impliquant la sortie est presque garanti d'invalider la sortie ou votre productivité ou les deux.
ÉDITER:
si vous adoptez la solution telle que je l'ai suggérée - c'est-à-dire, globalement - vous aurez des problèmes au cas où vous auriez besoin d'une version git repo . Donc, si vous souhaitez désactiver le filtrage de sortie pour un référentiel git spécifique, créez simplement à l'intérieur un fichier .git / info / attributes , avec
**. filtre ipynb =
comme contenu. En clair, de la même manière il est possible de faire l'inverse: activer le filtrage uniquement pour un référentiel spécifique.
le code est maintenant conservé dans son propre dépôt git
si les instructions ci-dessus aboutissent à ImportErrors, essayez d'ajouter "ipython" avant le chemin du script:
EDIT : mai 2016 (mis à jour en février 2017): il existe plusieurs alternatives à mon script - pour être complet, voici une liste de celles que je connais: nbstripout ( autres variantes ), nbstrip , jq .
la source
ImportError
me faire, j'ai dû modifier ce qui précède pour exécuter en utilisant ipython:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
~/.gitattributes
, les autres personnes ont les mêmes filtres que moi 2 ) J'ai défini l'expression rationnelle commeworkdir/**/*.ipynb filter=dropoutput_ipynb
, et je mets la plupart de mes blocs-notes dans workdir / => si je veux toujours pousser un bloc-notes avec la sortie et profiter du rendu pouvant être marqué dans github, je le mets juste en dehors de ce dossier.Nous avons un projet collaboratif où le produit est Jupyter Notebooks, et nous utilisons une approche pour les six derniers mois qui fonctionne très bien: nous activons l'
.py
enregistrement automatique des fichiers et suivons les.ipynb
fichiers et les.py
fichiers.De cette façon, si quelqu'un veut afficher / télécharger le dernier bloc-notes, il peut le faire via github ou nbviewer, et si quelqu'un veut voir comment le code du bloc-notes a changé, il peut simplement regarder les modifications apportées aux
.py
fichiers.Pour les
Jupyter
serveurs d'ordinateurs portables , cela peut être accompli en ajoutant les lignesdans le
jupyter_notebook_config.py
fichier et redémarrer le serveur de bloc-notes.Si vous ne savez pas dans quel répertoire trouver votre
jupyter_notebook_config.py
fichier, vous pouvez taperjupyter --config-dir
et si vous n'y trouvez pas le fichier, vous pouvez le créer en tapantjupyter notebook --generate-config
.Pour les
Ipython 3
serveurs d'ordinateurs portables , cela peut être accompli en ajoutant les lignesdans le
ipython_notebook_config.py
fichier et redémarrer le serveur de bloc-notes. Ces lignes proviennent d'une réponse aux problèmes github @minrk fournie et @dror les inclut également dans sa réponse SO.Pour les
Ipython 2
serveurs d'ordinateurs portables , cela peut être accompli en démarrant le serveur en utilisant:ou en ajoutant la ligne
dans le
ipython_notebook_config.py
fichier et redémarrer le serveur de bloc-notes.Si vous ne savez pas dans quel répertoire trouver votre
ipython_notebook_config.py
fichier, vous pouvez taperipython locate profile default
et si vous n'y trouvez pas le fichier, vous pouvez le créer en tapantipython profile create
.Voici notre projet sur github qui utilise cette approche : et voici un exemple github d'exploration des modifications récentes d'un bloc-notes .
Nous en sommes très satisfaits.
la source
--script
a fonctionné dans la pratique. Le problème est que les cahiers réels peuvent être énormes si les images sont conservées. Une solution idéale dans ce sens pourrait utiliser quelque chose comme git-annex pour garder une trace uniquement du dernier bloc-notes complet.--script
est obsolète. ipython.org/ipython-doc/3/whatsnew/version3.htmljupyter notebook --generate-config
pour créer un fichier de configuration. La commandejupyter --config-dir
découvre quel répertoire contient les fichiers de configuration. Et l'extrait de code donné par @Rich doit être ajouté au fichier nomméjupyter_notebook_config.py
. Le reste fonctionne comme avant.check_call(['ipython'
parcheck_call(['jupyter'
, sinon vous obtiendrez un avertissementipython nbconvert
obsolète et vous devriez utiliser à lajupyter nbconvert
place. (Jupyter v4.1.0, iPython v4.1.2)J'ai créé
nbstripout
, basé sur MinRKs gist , qui prend en charge Git et Mercurial (merci à mforbes). Il est destiné à être utilisé de manière autonome sur la ligne de commande ou comme filtre, qui est facilement (dés) installé dans le référentiel actuel vianbstripout install
/nbstripout uninstall
.Obtenez-le de PyPI ou simplement
la source
nbstripout
ne prend pas facilement en charge ce cas d'utilisation car il repose sur le format JSON du Notebook. Vous feriez probablement mieux d'écrire un script spécialisé dans votre cas d'utilisation.Voici une nouvelle solution de Cyrille Rossant pour IPython 3.0, qui persiste pour démarquer les fichiers plutôt que les fichiers ipymd basés sur json:
https://github.com/rossant/ipymd
la source
Après quelques années de suppression des sorties dans les ordinateurs portables, j'ai essayé de trouver une meilleure solution. J'utilise maintenant Jupytext , une extension pour Jupyter Notebook et Jupyter Lab que j'ai conçue.
Jupytext peut convertir les blocs-notes Jupyter en différents formats de texte (scripts, Markdown et R Markdown). Et inversement. Il offre également la possibilité d' associer un bloc-notes à l'un de ces formats et de synchroniser automatiquement les deux représentations du bloc-notes (un
.ipynb
et un.md/.py/.R
fichier).Permettez-moi d'expliquer comment Jupytext répond aux questions ci-dessus:
Le
.md/.py/.R
fichier contient uniquement les cellules d'entrée. Vous devez toujours suivre ce fichier. Versionnez le.ipynb
fichier uniquement si vous souhaitez suivre les sorties.Ajouter
*.ipynb
à.gitignore
Les sorties sont conservées dans le
.ipynb
fichier (local)Le diff sur le fichier
.py/.R
ou.md
est ce que vous recherchezTirez la dernière révision du fichier
.py/.R
ou.md
et actualisez votre bloc-notes dans Jupyter (Ctrl + R). Vous obtiendrez les dernières cellules d'entrée du fichier texte, avec les sorties correspondantes du.ipynb
fichier. Le noyau n'est pas affecté, ce qui signifie que vos variables locales sont préservées - vous pouvez continuer à travailler là où vous l'avez laissé.Ce que j'aime avec Jupytext, c'est que le cahier (sous la forme d'un
.py/.R
ou d' un.md
fichier) peut être édité dans votre IDE préféré. Avec cette approche, la refactorisation d'un ordinateur portable devient facile. Une fois que vous avez terminé, il vous suffit de rafraîchir le bloc-notes dans Jupyter.Si vous voulez l'essayer: installez Jupytext avec
pip install jupytext
et redémarrez votre Jupyter Notebook ou Lab Editor. Ouvrez le bloc-notes dont vous souhaitez contrôler la version et associez-le à un fichier Markdown (ou à un script) à l'aide du menu Jupytext du bloc-notes Jupyter (ou des commandes Jupytext de Jupyter Lab). Enregistrez votre bloc-notes et vous obtiendrez les deux fichiers: l'original.ipynb
, plus la représentation textuelle promise du bloc-notes, qui convient parfaitement au contrôle de version!Pour ceux qui pourraient être intéressés: Jupytext est également disponible sur la ligne de commande .
la source
J'ai finalement trouvé un moyen simple et productif de faire en sorte que Jupyter et Git jouent bien ensemble. J'en suis encore aux premiers pas, mais je pense déjà que c'est beaucoup mieux que toutes les autres solutions alambiquées.
Visual Studio Code est un éditeur de code open source sympa de Microsoft. Il a une excellente extension Python qui vous permet désormais d' importer un bloc-notes Jupyter en tant que code python. Maintenant, vous pouvez également modifier directement les blocs-notes Jupyter .
Après avoir importé votre bloc-notes dans un fichier python, tout le code et le démarquage seront réunis dans un fichier python ordinaire, avec des marqueurs spéciaux dans les commentaires. Vous pouvez voir dans l'image ci-dessous:
Votre fichier python n'a que le contenu des cellules d'entrée du bloc-notes. La sortie sera générée dans une fenêtre divisée. Vous avez du code pur dans le cahier, il ne change pas pendant que vous l'exécutez. Aucune sortie mélangée avec votre code. Pas de format JSON étrange et incompréhensible pour analyser vos différences.
Juste du code python pur où vous pouvez facilement identifier chaque diff.
Je n'ai même plus besoin de versionner mes
.ipynb
fichiers. Je peux mettre une*.ipynb
ligne dedans.gitignore
.Besoin de générer un cahier à publier ou à partager avec quelqu'un? Pas de problème, cliquez simplement sur le bouton d'exportation dans la fenêtre interactive de python
Si vous modifiez directement le bloc-notes, il y a maintenant une icône
Convert and save to a python script
.Voici une capture d'écran d'un bloc-notes dans Visual Studio Code:
Je ne l'utilise que depuis une journée, mais je peux enfin utiliser Jupyter avec Git.
PS: l'achèvement du code VSCode est bien meilleur que Jupyter.
la source
(2017-02)
stratégies
nbstripout
,)nbstripout
,)nbconvert
en python: name.ipynb.py (nbconvert
)nbconvert
,ipymd
)outils
nbstripout
: supprimer les sorties d'un ordinateur portablepip install nbstripout; nbstripout install
ipynb_output_filter
: supprimer les sorties d'un ordinateur portableipymd
: convertir entre {Jupyter, Markdown, O'Reilly Atlas Markdown, OpenDocument, .py}nbdime
: "Outils pour différencier et fusionner des cahiers Jupyter." (2015)nbdiff
: comparer les ordinateurs portables d'une manière conviviale pour les terminauxnbmerge
: fusion tridirectionnelle des blocs-notes avec résolution automatique des conflitsnbdiff-web
: vous montre un diff rendu riche de cahiersnbmerge-web
: vous offre un outil de fusion à trois sur le Web pour les ordinateurs portablesnbshow
: présenter un seul ordinateur portable de manière conviviale pour le terminalla source
Les réponses très populaires de 2016 ci-dessus sont des hacks incohérents par rapport à la meilleure façon de le faire en 2019.
Plusieurs options existent, la meilleure qui répond à la question est Jupytext.
Jupytext
Catch the Towards Data Science article on Jupytext
La façon dont cela fonctionne avec le contrôle de version consiste à placer les fichiers .py et .ipynb dans le contrôle de version. Regardez le .py si vous voulez le diff d'entrée, regardez le .ipynb si vous voulez la dernière sortie rendue.
Mentions notables: VS studio, nbconvert, nbdime, hydrogène
Je pense qu'avec un peu plus de travail, VS studio et / ou l'hydrogène (ou similaire) deviendront les acteurs dominants de la solution à ce workflow.
la source
Il suffit de tomber sur "jupytext" qui ressemble à une solution parfaite. Il génère un fichier .py à partir du bloc-notes, puis les synchronise. Vous pouvez contrôler la version, diff et fusionner les entrées via le fichier .py sans perdre les sorties. Lorsque vous ouvrez le bloc-notes, il utilise le .py pour les cellules d'entrée et le .ipynb pour la sortie. Et si vous souhaitez inclure la sortie dans git, vous pouvez simplement ajouter l'ipynb.
https://github.com/mwouts/jupytext
la source
Puisqu'il existe tellement de stratégies et d'outils pour gérer le contrôle de version pour les ordinateurs portables, j'ai essayé de créer un organigramme pour choisir une stratégie appropriée (créé en avril 2019)
la source
Comme indiqué par, le
--script
est déconseillé dans3.x
. Cette approche peut être utilisée en appliquant un hook post-sauvegarde. En particulier, ajoutez ce qui suit àipython_notebook_config.py
:Le code est tiré de # 8009 .
la source
.py
fichier vers un ordinateur portable est problématique, donc ce n'est malheureusement pas une solution complète. (Je souhaite en quelque sorte que ce soit car il est très agréable de différencier les.py
fichiers au lieu des cahiers. Peut-être que la nouvelle fonction de différenciation des cahiers sera utile.--script
comportement, indépendamment du contrôle de version. J'ai eu quelques problèmes au début, donc au cas où je pourrais faire gagner du temps à quelqu'un: 1) Si leipython_notebook_config.py
est absent du dossier de profil, lancez-leipython profile create
pour le générer. 2) S'il semble que le post-save-hook soit ignoré, exécutez ipython avec--debug
pour diagnostiquer le problème. 3) Si le script échoue avec une erreurImportError: No module named mistune
- installation simple minstue:pip install mistune
.Malheureusement, je ne sais pas grand-chose sur Mercurial, mais je peux vous donner une solution possible qui fonctionne avec Git, dans l'espoir que vous puissiez traduire mes commandes Git en leurs équivalents Mercurial.
Pour l'arrière-plan, dans Git, la
add
commande stocke les modifications apportées à un fichier dans une zone de transfert. Une fois que vous avez fait cela, toutes les modifications ultérieures du fichier sont ignorées par Git, sauf si vous lui demandez de les mettre en scène également. Par conséquent, le script suivant, qui, pour chacun des fichiers donnés, supprime tous lesoutputs
etprompt_number sections
, met en scène le fichier supprimé, puis restaure l'original:REMARQUE: si vous exécutez cette opération, vous obtenez un message d'erreur comme
ImportError: No module named IPython.nbformat
, puis utilisezipython
pour exécuter le script à la place depython
.Une fois le script exécuté sur les fichiers dont vous souhaitez valider les modifications, lancez-le
git commit
.la source
.clean
extension. Malheureusement, je ne pouvais pas voir comment faire cela sans modifier directement IPython (bien que ce changement ait été assez trivial). Je vais jouer avec cela pendant un certain temps et voir si cela convient à tous mes besoins.J'utilise une approche très pragmatique; qui fonctionnent bien pour plusieurs cahiers, sur plusieurs côtés. Et cela me permet même de «transférer» des cahiers. Il fonctionne aussi bien pour Windows que Unix / MacOS.
Al pensé que c'est simple, c'est résoudre les problèmes ci-dessus ...
Concept
Fondamentalement, ne suivez pas les
.ipnyb
fichiers -fichiers, seulement les.py
fichiers- correspondants .En démarrant le notebook-server avec l'
--script
option, ce fichier est automatiquement créé / enregistré lors de l'enregistrement du notebook.Ces
.py
fichiers contiennent toutes les entrées; le non-code est enregistré dans les commentaires, tout comme les bordures de cellule. Ces fichiers peuvent être lus / importés (et glissés) dans le notebook-server pour (re) créer un notebook. Seule la sortie a disparu; jusqu'à ce qu'il soit réexécuté.Personnellement, j'utilise mercurial pour suivre la version des
.py
fichiers; et utilisez les commandes normales (ligne de commande) pour ajouter, archiver (ect) pour cela. La plupart des autres (D) VCS le permettront.C'est simple de suivre l'histoire maintenant; ils
.py
sont petits, textuels et simples à différencier. De temps en temps, nous avons besoin d'un clone (il suffit de créer une branche; lancez un deuxième ordinateur portable là-bas), ou une version plus ancienne (vérifiez-le et importez-le dans un ordinateur portable-serveur), etc.Conseils & Astuces
--script
option) et faire un suivi de version.py
fichier, mais ne l' archive pas .Vœux
file@date+rev.py
) devrait être utile. Il serait beaucoup de travail d'ajouter cela; et peut-être que je le ferai une fois. Jusqu'à présent, je fais juste ça à la main.la source
.py
fichier à un ordinateur portable? J'aime cette approche, mais parce que.ipynb
->.py
->.ipynb
est potentiellement avec perte, je n'y ai pas pensé sérieusement..py
la.ipynb
formats. Il y a un problème à ce sujet - alors peut-être que cela constituera la base d'une solution complète..py
fichiers en.ipynb
fichiers.nbconvert
ne semble pas encore prendre en charge cela, et je n'ai pas de tableau de bord de bloc-notes car je lanceipython notebook
manuellement. Avez-vous des suggestions générales sur la façon de mettre en œuvre cette conversion en amont?.py
transformation en ordinateur portable n'est pas destinée à un aller-retour. Donc, cela ne peut pas vraiment être une solution générale, mais c'est agréable, cela fonctionne pour vous.Pour faire suite à l'excellent script de Pietro Battiston, si vous obtenez une erreur d'analyse Unicode comme celle-ci:
Vous pouvez ajouter au début du script:
la source
J'ai construit un package python qui résout ce problème
https://github.com/brookisme/gitnb
Il fournit à une CLI une syntaxe inspirée de git pour suivre / mettre à jour / diff les cahiers à l'intérieur de votre dépôt git.
Voici un exemple
Notez que la dernière étape, où j'utilise "gitnb commit" est de valider votre dépôt git. C'est essentiellement un emballage pour
Il existe plusieurs autres méthodes, et peut être configuré de sorte qu'il nécessite plus ou moins d'entrée utilisateur à chaque étape, mais c'est l'idée générale.
la source
Après avoir fouillé, j'ai finalement trouvé ce crochet de pré-sauvegarde relativement simple sur les documents Jupyter . Il supprime les données de sortie de cellule. Vous devez le coller dans le
jupyter_notebook_config.py
fichier (voir ci-dessous pour les instructions).De la réponse de Rich Signell :
la source
J'ai fait ce qu'Albert & Rich a fait - Ne pas versionner les fichiers .ipynb (car ceux-ci peuvent contenir des images, ce qui devient désordonné). Au lieu de cela, exécutez
ipython notebook --script
ou placez toujoursc.FileNotebookManager.save_script = True
votre fichier de configuration, de sorte qu'un (versionnable).py
fichier soit toujours créé lorsque vous enregistrez votre bloc-notes.Pour régénérer des cahiers (après avoir vérifié un repo ou changé de branche) j'ai mis le script py_file_to_notebooks.py dans le répertoire où je stocke mes cahiers.
Maintenant, après avoir vérifié un dépôt, il suffit de lancer
python py_file_to_notebooks.py
pour générer les fichiers ipynb. Après avoir changé de branche, vous devrez peut-être exécuterpython py_file_to_notebooks.py -ov
pour remplacer les fichiers ipynb existants.Juste pour être prudent, il est bon d'ajouter également
*.ipynb
à votre.gitignore
fichier.Edit: je ne fais plus cela parce que (A) vous devez régénérer vos cahiers à partir de fichiers py à chaque fois que vous extrayez une branche et (B) il y a d'autres choses comme le démarque dans les cahiers que vous perdez. Au lieu de cela, je supprime la sortie des ordinateurs portables à l'aide d'un filtre git. La discussion sur la façon de procéder est ici .
la source
.py
fichiers en arrière.ipynb
était problématique, en particulier avec les ordinateurs portables de la version 4 pour lesquels il n'y a pas encore de convertisseur. Il faudrait actuellement utiliser l'importateur v3 puis convertir en v4 et je suis un peu préoccupé par ce voyage compliqué. De plus, un.py
fichier n'est pas un très bon choix si le cahier est principalement du code Julia! Enfin,--script
est obsolète, donc je pense que les crochets sont la voie à suivre.Ok, donc cela ressemble à la meilleure solution actuelle, selon une discussion ici , consiste à créer un filtre git pour supprimer automatiquement la sortie des fichiers ipynb lors de la validation.
Voici ce que j'ai fait pour le faire fonctionner (copié de cette discussion):
J'ai légèrement modifié le fichier nbstripout de cfriedline pour donner une erreur informative lorsque vous ne pouvez pas importer la dernière IPython: https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output et l'a ajouté à dire
./relative/path/to/strip_notebook_output
A également ajouté le fichier .gitattributes à la racine du dépôt, contenant:
Et créé un
setup_git_filters.sh
contenantEt a couru
source setup_git_filters.sh
. La fantaisie $ (git rev-parse ...) est de trouver le chemin local de votre dépôt sur n'importe quelle machine (Unix).la source
Cette extension jupyter permet aux utilisateurs de pousser les cahiers jupyter directement vers github.
Veuillez regarder ici
https://github.com/sat28/githubcommit
la source
Nous sommes en avril 2020 et il existe de nombreuses stratégies et outils pour le contrôle de la version du portable Jupyter. Voici un bref aperçu de tous les outils que vous pouvez utiliser,
nbdime - Agréable pour la diff'ing locale et la fusion de cahiers
nbstripout - Un filtre git pour supprimer automatiquement les sorties du notebook avant chaque commit
jupytext - Conserve un fichier compagnon .py synchronisé avec chaque ordinateur portable. Vous ne validez que les fichiers .py
nbconvert - Convertit des blocs-notes en script python ou HTML (ou les deux) et valide ces autres types de fichiers
ReviewNB - Affiche la différence de bloc-notes (avec la sortie) pour toute demande de validation ou d'extraction sur GitHub. On peut également écrire des commentaires sur les cellules du carnet pour discuter des changements (capture d'écran ci-dessous).
Avertissement: j'ai créé ReviewNB.
la source
Que diriez-vous de l'idée discutée dans le post ci-dessous, où la sortie du bloc-notes devrait être conservée, avec l'argument que cela pourrait prendre beaucoup de temps pour le générer, et c'est pratique car GitHub peut maintenant rendre les blocs-notes. Des crochets d'enregistrement automatique ont été ajoutés pour exporter le fichier .py, utilisés pour les différences et .html pour le partage avec les membres de l'équipe qui n'utilisent pas de bloc-notes ou de git.
https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d
la source