Qual é uma boa estratégia para manter os notebooks IPython sob controle de versão?
O formato do notebook é bastante acessível para o controle de versão: se alguém deseja controlar o notebook e as saídas, ele funciona muito bem. O aborrecimento ocorre quando se quer apenas controlar a versão da entrada, excluindo as saídas de célula (também conhecidas como "produtos de construção") que podem ser grandes bolhas binárias, especialmente para filmes e plotagens. Em particular, estou tentando encontrar um bom fluxo de trabalho que:
- permite escolher entre incluir ou excluir a saída,
- me impede de confirmar acidentalmente a saída, se eu não a quiser,
- me permite manter a saída na minha versão local,
- permite que eu veja quando tenho alterações nas entradas usando meu sistema de controle de versão (ou seja, se eu controlo apenas as entradas, mas meu arquivo local tem saídas, gostaria de poder ver se as entradas foram alteradas (exigindo uma confirmação O uso do comando status do controle de versão sempre registra uma diferença, pois o arquivo local possui saídas.)
- permite atualizar meu notebook de trabalho (que contém a saída) de um notebook limpo e atualizado. (atualizar)
Como mencionado, se eu optar por incluir as saídas (o que é desejável ao usar o nbviewer, por exemplo), tudo está bem. O problema é quando eu não quero controlar a versão da saída. Existem algumas ferramentas e scripts para eliminar a saída do notebook, mas frequentemente encontro os seguintes problemas:
- Eu acidentalmente confirmo uma versão com a saída, poluindo assim meu repositório.
- Limpo a saída para usar o controle de versão, mas realmente prefiro manter a saída na minha cópia local (às vezes leva um tempo para reproduzir, por exemplo).
- Alguns dos scripts que retiram a saída alteram ligeiramente o formato em comparação com a
Cell/All Output/Clear
opção de menu, criando assim ruídos indesejados nos diffs. Isso é resolvido por algumas das respostas. - Ao puxar alterações para uma versão limpa do arquivo, preciso encontrar uma maneira de incorporar essas alterações no meu notebook de trabalho sem precisar executar novamente tudo. (atualizar)
Eu considerei várias opções que discutirei abaixo, mas ainda não encontrei uma boa solução abrangente. Uma solução completa pode exigir algumas alterações no IPython ou depender de alguns scripts externos simples. Atualmente, uso mercurial , mas gostaria de uma solução que também funcione com o git : uma solução ideal seria independente do controle de versão.
Esse problema foi discutido várias vezes, mas não há uma solução definitiva ou clara da perspectiva do usuário. A resposta a esta pergunta deve fornecer a estratégia definitiva. Não há problema em exigir uma versão recente (mesmo em desenvolvimento) do IPython ou uma extensão facilmente instalada.
Atualização: Eu brinquei com a versão modificada do meu notebook, que opcionalmente salva uma .clean
versão a cada salvamento, usando as sugestões de Gregory Crosswhite . Isso satisfaz a maioria das minhas restrições, mas deixa o seguinte não resolvido:
- Essa ainda não é uma solução padrão (requer uma modificação da fonte ipython. Existe uma maneira de obter esse comportamento com uma extensão simples? Precisa de algum tipo de gancho para salvar.
- Um problema que tenho no fluxo de trabalho atual está provocando alterações. Eles entrarão no
.clean
arquivo e precisam ser integrados de alguma forma à minha versão de trabalho. (Obviamente, eu sempre posso reexecutar o notebook, mas isso pode ser uma dor, especialmente se alguns dos resultados dependem de cálculos longos, cálculos paralelos etc.). Ainda não tenho uma boa idéia sobre como resolver isso. . Talvez um fluxo de trabalho envolvendo uma extensão como o ipycache possa funcionar, mas isso parece um pouco complicado.
Notas
Remoção (remoção) da saída
- Quando o notebook está funcionando, pode-se usar a
Cell/All Output/Clear
opção de menu para remover a saída. - Existem alguns scripts para remover a saída, como o script nbstripout.py, que remove a saída, mas não produz a mesma saída que a interface do notebook. Eventualmente, isso foi incluído no repositório ipython / nbconvert , mas foi encerrado, informando que as alterações agora estão incluídas no ipython / ipython , mas a funcionalidade correspondente parece não ter sido incluída ainda. (update) Dito isto, a solução de Gregory Crosswhite mostra que isso é bastante fácil de fazer, mesmo sem chamar ipython / nbconvert, portanto, essa abordagem provavelmente é viável se puder ser conectada adequadamente. (Anexá-la a cada sistema de controle de versão, no entanto, não parece uma boa idéia - isso deve, de alguma forma, conectar-se ao mecanismo do notebook).
Grupos de Notícias
Problemas
- 977: Solicitações de recursos do notebook (aberto) .
- 1280: opção Limpar tudo ao salvar (Abrir) . (Segue desta discussão .)
- 3295: blocos de notas autoexportados: apenas exportam células marcadas explicitamente (Fechadas) . Resolvido pela extensão 11 Adicione magia de escrever e executar (Mesclado) .
Solicitações Pull
- 1621: apague os números do prompt [] em "Apagar tudo resultado" (mesclado) . (Veja também 2519 (Mesclado) .)
- 1563: melhorias de clear_output (mesclado) .
- 3065: dificuldade de notebooks (fechada) .
- 3291: adicione a opção para ignorar as células de saída ao salvar. (Fechado) . Isso parece extremamente relevante, mas foi encerrado com a sugestão de usar um filtro "limpo / mancha". Uma pergunta relevante, o que você pode usar se quiser retirar a saída antes de executar o git diff? parece não ter sido respondido.
- 3312: WIP: ganchos para salvar notebook (fechados) .
- 3747: ipynb -> transformador ipynb (fechado) . Isso é reformulado em 4175 .
- 4175: nbconvert: base exportadora de Jinjaless (mesclada) .
- 142: Use STDIN em nbstripout se nenhuma entrada for fornecida (Aberto) .
fonte
--script
opção, mas que foi removida. Estou esperando até que os ganchos pós-salvamento sejam implementados ( que são planejados ) e, nesse ponto, acho que poderei fornecer uma solução aceitável combinando várias das técnicas.Respostas:
Aqui está a minha solução com o git. Ele permite que você adicione e confirme (e diff) como de costume: essas operações não alterarão sua árvore de trabalho e, ao mesmo tempo (re) executar um notebook, não alterará seu histórico do git.
Embora isso possa provavelmente ser adaptado a outros VCSs, eu sei que ele não atende aos seus requisitos (pelo menos a agnosticidade do VSC). Ainda assim, é perfeito para mim e, embora não seja nada particularmente brilhante, e muitas pessoas provavelmente já o usam, não encontrei instruções claras sobre como implementá-lo pesquisando no Google. Portanto, pode ser útil para outras pessoas.
~/bin/ipynb_output_filter.py
)chmod +x ~/bin/ipynb_output_filter.py
)Crie o arquivo
~/.gitattributes
, com o seguinte conteúdoExecute os seguintes comandos:
Feito!
Limitações:
somebranch
e o fazgit checkout otherbranch; git checkout somebranch
, geralmente espera que a árvore de trabalho permaneça inalterada. Aqui, em vez disso, você terá perdido a numeração de saída e de células dos notebooks cuja origem difere entre os dois ramos.git commit notebook_file.ipynb
, embora ao menos se mantivessegit diff notebook_file.ipynb
livre do lixo base64).Minha solução reflete o fato de que eu pessoalmente não gosto de manter o material gerado com versão - observe que fazer fusões envolvendo a saída é quase garantido para invalidar a saída ou sua produtividade ou ambas.
EDITAR:
se você adotar a solução como sugeri, ou seja, globalmente, você terá problemas no caso de algum repositório git que deseja versão de saída. Portanto, se você deseja desativar a filtragem de saída para um repositório git específico, basta criar dentro dele um arquivo .git / info / attribute , com
**. ipynb filter =
como conteúdo. Claramente, da mesma maneira, é possível fazer o oposto: ativar a filtragem apenas para um repositório específico.
o código agora é mantido em seu próprio repositório git
se as instruções acima resultarem em ImportErrors, tente adicionar "ipython" antes do caminho do script:
EDIT : maio de 2016 (atualizado em fevereiro de 2017): existem várias alternativas ao meu script - por uma questão de integridade, aqui está uma lista das que eu conheço: nbstripout ( outras variantes ), nbstrip , jq .
fonte
ImportError
que eu tinha alter ao acima para executar usando ipython:git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
~/.gitattributes
, outras pessoas têm os mesmos filtros que eu 2 ) Eu defini o regexp comoworkdir/**/*.ipynb filter=dropoutput_ipynb
e coloco a maioria dos meus cadernos no workdir / => se ainda quero enviar um notebook com a saída e aproveitar a renderização que pode ser marcada no github, basta colocá-lo fora dessa pasta.Temos um projeto colaborativo em que o produto é o Jupyter Notebooks e usamos uma abordagem nos últimos seis meses que funciona muito bem: ativamos o salvamento dos
.py
arquivos automaticamente e rastreamos os.ipynb
arquivos e os.py
arquivos.Dessa forma, se alguém quiser visualizar / baixar o bloco de anotações mais recente, poderá fazê-lo via github ou nbviewer, e se alguém quiser ver como o código do bloco de anotações foi alterado, basta ver as alterações nos
.py
arquivos.Para
Jupyter
servidores notebook , isso pode ser feito adicionando as linhaspara o
jupyter_notebook_config.py
arquivo e reiniciando o servidor do notebook.Se você não tiver certeza de qual diretório localizar o
jupyter_notebook_config.py
arquivo, digitejupyter --config-dir
e, se não encontrar o arquivo, poderá criá-lo digitandojupyter notebook --generate-config
.Para
Ipython 3
servidores notebook , isso pode ser feito adicionando as linhaspara o
ipython_notebook_config.py
arquivo e reiniciando o servidor do notebook. Essas linhas são de um problema do github, que a resposta é @minrk fornecida e o @dror as inclui na resposta SO também.Para
Ipython 2
servidores notebook , isso pode ser feito iniciando o servidor usando:ou adicionando a linha
para o
ipython_notebook_config.py
arquivo e reiniciando o servidor do notebook.Se você não tiver certeza de qual diretório localizar o
ipython_notebook_config.py
arquivo, digiteipython locate profile default
e, se não encontrar o arquivo, poderá criá-lo digitandoipython profile create
.Aqui está o nosso projeto no github que está usando essa abordagem : e aqui está um exemplo do github de explorar alterações recentes em um notebook .
Ficamos muito felizes com isso.
fonte
--script
funcionou na prática. O problema é que os notebooks reais podem ser enormes se as imagens forem mantidas. Uma solução ideal nesse caminho pode usar algo como o anexo-git para acompanhar apenas o último notebook completo.--script
foi descontinuado. ipython.org/ipython-doc/3/whatsnew/version3.htmljupyter notebook --generate-config
para criar um arquivo de configuração. O comandojupyter --config-dir
descobre qual diretório contém os arquivos de configuração. E o trecho de código fornecido por @Rich deve ser adicionado ao arquivo nomeadojupyter_notebook_config.py
. O resto funciona como antes.check_call(['ipython'
comcheck_call(['jupyter'
, caso contrário, você receberá um aviso queipython nbconvert
foi descontinuado e você deve usá-lojupyter nbconvert
. (Jupyter v4.1.0, iPython v4.1.2)Eu criei
nbstripout
, com base na essência do MinRKs , que suporta tanto o Git quanto o Mercurial (graças a mforbes). Ele deve ser usado de forma independente na linha de comando ou como um filtro, que é facilmente (des) instalado no repositório atual vianbstripout install
/nbstripout uninstall
.Obtenha do PyPI ou simplesmente
fonte
nbstripout
esse suporte não é fácil, pois depende do formato JSON do Notebook. Provavelmente, é melhor escrever um script especializado no seu caso de uso.Aqui está uma nova solução da Cyrille Rossant para IPython 3.0, que persiste nos arquivos de marcação em vez dos arquivos ipymd baseados em json:
https://github.com/rossant/ipymd
fonte
Após alguns anos removendo as saídas dos notebooks, tentei encontrar uma solução melhor. Agora uso o Jupytext , uma extensão para o Jupyter Notebook e o Jupyter Lab que eu projetei.
O Jupytext pode converter os blocos de anotações Jupyter em vários formatos de texto (Scripts, Markdown e R Markdown). E inversamente. Ele também oferece a opção de emparelhar um notebook a um desses formatos e sincronizar automaticamente as duas representações do notebook (um
.ipynb
e um.md/.py/.R
arquivo).Deixe-me explicar como o Jupytext responde às perguntas acima:
O
.md/.py/.R
arquivo contém apenas as células de entrada. Você sempre deve acompanhar este arquivo. Versão do.ipynb
arquivo somente se você deseja rastrear as saídas.Adicionar
*.ipynb
a.gitignore
As saídas são preservadas no
.ipynb
arquivo (local)O diff no arquivo
.py/.R
ou.md
é o que você está procurandoPuxe a revisão mais recente do arquivo
.py/.R
ou.md
e atualize seu notebook no Jupyter (Ctrl + R). Você obterá as células de entrada mais recentes do arquivo de texto, com saídas correspondentes do.ipynb
arquivo. O kernel não é afetado, o que significa que suas variáveis locais são preservadas - você pode continuar trabalhando onde parou.O que eu adoro no Jupytext é que o notebook (sob a forma de um
.py/.R
ou.md
arquivo) pode ser editado no seu IDE favorito. Com essa abordagem, a refatoração de um notebook se torna fácil. Quando terminar, basta atualizar o notebook no Jupyter.Se você quiser experimentá-lo: instale o Jupytext
pip install jupytext
e reinicie o editor do Jupyter Notebook ou Lab. Abra o bloco de notas que você deseja controlar a versão e emparelhe-o com um arquivo Markdown (ou um Script) usando o Menu Jupytext no bloco de anotações Jupyter (ou os comandos Jupytext no Jupyter Lab). Salve o seu notebook e você obterá os dois arquivos: o original.ipynb
, além da representação de texto prometida do notebook, que é perfeita para o controle de versão!Para aqueles que podem estar interessados: o Jupytext também está disponível na linha de comando .
fonte
Eu finalmente encontrei uma maneira produtiva e simples de fazer Jupyter e Git tocar bem juntos. Ainda estou nos primeiros passos, mas já acho que é muito melhor do que todas as outras soluções complicadas.
O Visual Studio Code é um editor legal e de código-fonte aberto da Microsoft. Possui uma excelente extensão Python que agora permite importar um Notebook Jupyter como código python. Agora você também pode editar diretamente os Jupyter Notebooks .
Depois de importar o seu notebook para um arquivo python, todo o código e descontos serão reunidos em um arquivo python comum, com marcadores especiais nos comentários. Você pode ver na imagem abaixo:
Seu arquivo python apenas possui o conteúdo das células de entrada do notebook. A saída será gerada em uma janela dividida. Você tem código puro no notebook, ele não muda enquanto você o executa. Nenhuma saída misturada com o seu código. Nenhum formato incompreensível JSON estranho para analisar suas diferenças.
Apenas código python puro, onde você pode identificar facilmente todas as diferenças.
Eu nem preciso mais versão meus
.ipynb
arquivos. Eu posso colocar uma*.ipynb
linha.gitignore
.Precisa gerar um notebook para publicar ou compartilhar com alguém? Não tem problema, basta clicar no botão de exportação na janela interativa do python
Se você estiver editando o notebook diretamente, agora existe um ícone
Convert and save to a python script
.Aqui está uma captura de tela de um notebook dentro do Visual Studio Code:
Estou usando há apenas um dia, mas finalmente posso usar o Jupyter com o Git.
PS: A conclusão do código VSCode é muito melhor que o Jupyter.
fonte
(2017-02)
estratégias
nbstripout
,)nbstripout
,)nbconvert
para python: name.ipynb.py (nbconvert
)nbconvert
,ipymd
)Ferramentas
nbstripout
: tira as saídas de um notebookpip install nbstripout; nbstripout install
ipynb_output_filter
: tira as saídas de um notebookipymd
: converte entre {Jupyter, Markdown, O'Reilly Atlas Markdown, OpenDocument, .py}nbdime
: "Ferramentas para diferenciar e mesclar notebooks Jupyter." (2015)nbdiff
: compare notebooks de maneira amigável ao terminalnbmerge
: mesclagem tripla de notebooks com resolução automática de conflitosnbdiff-web
: mostra uma rica variedade de cadernos renderizadosnbmerge-web
: fornece a você uma ferramenta de mesclagem de três vias baseada na Web para notebooksnbshow
: apresentar um único notebook de maneira amigável ao terminalfonte
As respostas muito populares de 2016 acima são hacks inconsistentes em comparação com a melhor maneira de fazer isso em 2019.
Existem várias opções, a melhor que responde à pergunta é o Jupytext.
Jupytext
Veja o artigo Towards Data Science no Jupytext
A maneira como funciona com o controle de versão é colocar os arquivos .py e .ipynb no controle de versão. Veja o .py se desejar a diferença de entrada, veja o .ipynb se desejar a saída renderizada mais recente.
Menções notáveis: VS studio, nbconvert, nbdime, hidrogênio
Eu acho que com um pouco mais de trabalho, o VS Studio e / ou o hidrogênio (ou similar) se tornarão os atores dominantes na solução desse fluxo de trabalho.
fonte
Basta encontrar o "jupytext", que parece uma solução perfeita. Ele gera um arquivo .py do notebook e mantém os dois em sincronia. Você pode controlar as versões, diferenciar e mesclar entradas através do arquivo .py sem perder as saídas. Quando você abre o notebook, ele usa o .py para células de entrada e o .ipynb para saída. E se você quiser incluir a saída no git, basta adicionar o ipynb.
https://github.com/mwouts/jupytext
fonte
Como existem tantas estratégias e ferramentas para lidar com o controle de versão de notebooks, tentei criar um fluxograma para escolher uma estratégia adequada (criada em abril de 2019)
fonte
Conforme apontado por, o
--script
item foi descontinuado em3.x
. Essa abordagem pode ser usada aplicando um gancho pós-salvamento. Em particular, adicione o seguinte aipython_notebook_config.py
:O código é retirado do número 8009 .
fonte
.py
arquivo para um notebook é problemático, portanto, infelizmente, essa não é uma solução completa. (Eu meio que gostaria que fosse, pois é muito bom para diff.py
arquivos em vez de notebooks Talvez o novo. Notebook diff recurso será útil.--script
comportamento, independentemente do controle de versão. Eu tive alguns problemas no começo, então, caso eu possa economizar tempo para alguém: 1) Seipython_notebook_config.py
estiver faltando na pasta de perfil, corraipython profile create
para gerá-lo. 2) Se parecer que o gancho pós-salvamento foi ignorado, execute o ipython com--debug
para diagnosticar o problema. 3) Se o script falhar com o erroImportError: No module named mistune
- instalação simples minstue:pip install mistune
.Infelizmente, eu não sei muito sobre o Mercurial, mas posso oferecer uma possível solução que funcione com o Git, na esperança de que você possa traduzir meus comandos do Git em seus equivalentes do Mercurial.
Para segundo plano, no Git, o
add
comando armazena as alterações que foram feitas em um arquivo em uma área intermediária. Depois de fazer isso, quaisquer alterações subseqüentes no arquivo serão ignoradas pelo Git, a menos que você solicite que as encaminhe também. Portanto, o script a seguir, que, para cada um dos arquivos fornecidos, retira todos osoutputs
eprompt_number sections
, prepara o arquivo retirado e restaura o original:NOTA: Se você executar uma mensagem de erro assim
ImportError: No module named IPython.nbformat
, use-oipython
para executar o script em vez depython
.Depois que o script for executado nos arquivos cujas alterações você deseja confirmar, basta executar
git commit
.fonte
.clean
extensão. Infelizmente, não consegui ver como fazer isso sem modificar diretamente o IPython (embora essa alteração tenha sido bastante trivial). Vou brincar com isso por um tempo e ver se ele atende a todas as minhas necessidades.Eu uso uma abordagem muito pragmática; que funcionam bem em vários notebooks, em vários lados. E até me permite 'transferir' notebooks. Funciona tanto para Windows como Unix / MacOS.
Al pensei que é simples, é resolver os problemas acima ...
Conceito
Basicamente, não rastreie os
.ipnyb
arquivos-, apenas os.py
arquivos- correspondentes .Ao iniciar o servidor notebook com a
--script
opção, esse arquivo é criado / salvo automaticamente quando o notebook é salvo.Esses
.py
arquivos contêm toda a entrada; o não código é salvo em comentários, assim como as bordas da célula. Esses arquivos podem ser lidos / importados (e arrastados) para o servidor notebook para (re) criar um notebook. Somente a saída se foi; até que seja reexecutado.Pessoalmente, uso o mercurial para rastrear versão dos
.py
arquivos; e use os comandos normais (linha de comando) para adicionar, fazer check-in (ect) para isso. A maioria dos outros (D) VCS permitirá isso.É simples acompanhar a história agora; o
.py
são pequenos, textual e simples diff. De vez em quando, precisamos de um clone (basta ramificar; iniciar um segundo notebook), ou uma versão mais antiga (check-out e importar para um servidor notebook), etc.Dicas e truques
--script
opção) e faça o controle de versão.py
arquivo-mas não o faz check-in.Desejos
file@date+rev.py
) deve ser útil. Seria muito trabalho acrescentar isso; e talvez eu faça isso uma vez. Até agora, eu faço isso manualmente.fonte
.py
arquivo de volta para um notebook? Eu gosto dessa abordagem, mas porque.ipynb
->.py
->.ipynb
é potencialmente com perdas, não considerei isso seriamente..py
para os.ipynb
formatos. Existe um problema sobre isso - talvez isso constitua a base para uma solução completa..py
arquivos para.ipynb
arquivos.nbconvert
ainda não parece oferecer suporte a isso e não tenho um painel de anotações desde que executoipython notebook
manualmente. Você tem alguma sugestão geral sobre como implementar essa conversão para trás?.py
transformação de notebook em notebook não se destina a viagens de ida e volta. Portanto, isso realmente não pode ser uma solução geral, embora seja bom que funcione para você.Para acompanhar o excelente script de Pietro Battiston, se você receber um erro de análise Unicode como este:
Você pode adicionar no início do script:
fonte
Eu construí um pacote python que resolve esse problema
https://github.com/brookisme/gitnb
Ele fornece à CLI uma sintaxe inspirada no git para rastrear / atualizar / diferenciar notebooks dentro do seu repositório git.
Heres é um exemplo
Observe que a última etapa, na qual estou usando o "gitnb commit", está comprometendo seu repositório git. É essencialmente um invólucro para
Existem vários outros métodos, e podem ser configurados para que exijam mais ou menos entrada do usuário em cada estágio, mas essa é a ideia geral.
fonte
Depois de pesquisar, finalmente encontrei esse gancho de pré-gravação relativamente simples nos documentos do Jupyter . Ele retira os dados de saída da célula. Você precisa colá-lo no
jupyter_notebook_config.py
arquivo (veja as instruções abaixo).Da resposta de Rich Signell :
fonte
Fiz o que Albert e Rich fizeram - Não faça a versão de arquivos .ipynb (pois eles podem conter imagens, o que fica confuso). Em vez disso, sempre execute
ipython notebook --script
ou coloquec.FileNotebookManager.save_script = True
seu arquivo de configuração, para que um (versionável).py
arquivo seja sempre criado quando você salvar seu notebook.Para regenerar os blocos de anotações (após fazer o check-out de um repositório ou alternar uma ramificação), coloquei o script py_file_to_notebooks.py no diretório em que armazeno meus blocos de anotações.
Agora, depois de verificar um repo, basta executar
python py_file_to_notebooks.py
para gerar os arquivos ipynb. Após alternar a ramificação, talvez seja necessário executarpython py_file_to_notebooks.py -ov
a substituição dos arquivos ipynb existentes.Só por segurança, é bom também adicionar
*.ipynb
ao seu.gitignore
arquivo.Edit: Eu não faço mais isso (A) porque você precisa regenerar seus blocos de anotações de arquivos py toda vez que faz check-out de uma filial e (B) há outras coisas, como descontos nos blocos de anotações que você perde. Em vez disso, retiro a saída dos notebooks usando um filtro git. A discussão sobre como fazer isso está aqui .
fonte
.py
arquivos para trás.ipynb
é problemática, especialmente nos notebooks da versão 4 para os quais ainda não há um conversor. No momento, seria necessário usar o importador v3 e depois converter para v4, e estou um pouco preocupado com essa viagem complicada. Além disso, um.py
arquivo não é uma escolha muito boa se o notebook for principalmente o código Julia! Finalmente,--script
está obsoleto, então acho que os ganchos são o caminho a percorrer.Ok, então parece que a melhor solução atual, de acordo com uma discussão aqui , é criar um filtro git para remover automaticamente a saída dos arquivos ipynb no commit.
Aqui está o que eu fiz para fazê-lo funcionar (copiado dessa discussão):
Modifiquei levemente o arquivo nbstripout do cfriedline para fornecer um erro informativo quando você não pode importar o IPython mais recente: https://github.com/petered/plato/blob/fb2f4e252f50c79768920d0e47b870a8d799e92b/notebooks/config/strip_notebook_output E acrescentou : diga em
./relative/path/to/strip_notebook_output
Também foi adicionado o arquivo .gitattributes à raiz do repositório, contendo:
E criou um
setup_git_filters.sh
contendoE correu
source setup_git_filters.sh
. A coisa chique de $ (git rev-parse ...) é encontrar o caminho local do seu repositório em qualquer máquina (Unix).fonte
Essa extensão jupyter permite que os usuários enviem blocos de anotações jupyter diretamente para o github.
Por favor olhe aqui
https://github.com/sat28/githubcommit
fonte
Estamos em abril de 2020 e existem muitas estratégias e ferramentas para o controle de versão do notebook Jupyter. Aqui está uma rápida visão geral de todas as ferramentas que você pode usar,
nbdime - Agradável para difusão local e mesclagem de notebooks
nbstripout - Um filtro git para remover automaticamente as saídas do notebook antes de cada confirmação
jupytext - Mantém um arquivo complementar .py sincronizado com cada bloco de anotações. Você só confirma arquivos .py
nbconvert - Converte blocos de anotações em um script python ou HTML (ou ambos) e confirma esses tipos de arquivos alternativos
ReviewNB - Mostra o diff do notebook (junto com a saída) para qualquer solicitação de confirmação ou recebimento no GitHub. Também é possível escrever comentários nas células dos notebooks para discutir as alterações (captura de tela abaixo).
Disclaimer: Eu criei o ReviewNB.
fonte
Que tal a idéia discutida no post abaixo, onde a saída do notebook deve ser mantida, com o argumento de que pode levar muito tempo para gerá-lo, e é útil, já que o GitHub agora pode renderizar notebooks. Existem ganchos de salvamento automático adicionados para exportar arquivos .py, usados para diffs e .html para compartilhar com membros da equipe que não usam blocos de anotações ou git.
https://towardsdatascience.com/version-control-for-jupyter-notebook-3e6cef13392d
fonte