SORU
11 EYLÜL 2013, ÇARŞAMBA


Kullanarak sürüm denetimi altında defter İPython

Sürüm kontrol altında IPython defter tutmak için iyi bir strateji nedir?

Eğer bir sürüm kontrol etmek için defter ve oldukça iyi çalışıyor bu verir isterse. notebook formatı oldukça uygun sürümü kontrol: Sıkıntı bir tek giriş, hücre çıkışları hariç sürümü kontrol etmek istediğinde gelir (aka. "ürünler oluşturmak") büyük ikili lekeler, özellikle film ve araziler için olabilir. Özellikle, iyi bir iş bulmaya çalışıyorum:

  • bana veya çıkış dahil hariç arasında seçim yapmanızı sağlar
  • yanlışlıkla eğer istiyorum eğer çıkış işlemekten beni engeller
  • benim yerel versiyonu çıktı kalmasını sağlar
  • tanır beni görünce ben değişiklikleri girişlerini kullanarak benim sürüm kontrol sistemi (Yani eğer sadece sürüm kontrolü girdiler ama benim yerel dosya çıktıları, sonra ben orada olmak istiyor mümkün görmek için giriş değişti (gerektiren bir commit). Sürüm kontrol durum komutunu kullanarak her zaman yerel dosya çıkışları vardır beri bir fark kaydeder.)
  • beni haberdar temiz bir dizüstü bilgisayardan çalışma defterimi çıkış içerir) güncellemek için izin verir.(update)

Belirtildiği gibi, Eğer çıkışları vardır seçtim örneğin nbviewer kullanırken tercih edilir), sonra da her şey yolunda. Sorun bendeyokçıkış sürümü kontrol etmek istiyorum. Dizüstü bilgisayar çıktısı sıyırma için bazı araçlar ve komut vardır, ama sık sık ben de aşağıdaki sorunlarla karşılaşabilirsiniz:

  1. Yanlışlıkla çıkış ile bir sürümü, böylece benim depo kirletici işlemek.
  2. Sürüm kontrolü kullanmalarını çıktı ben açık, ama gerçekten benim yerel kopyasını (bazen bir süre örneğin yeniden oluşturmak için gereken) çıktı.
  3. Şerit çıkış biçimini değiştiren bazı senaryoları biraz Cell/All Output/Clear menü seçeneği, böylece farklar istenmeyen gürültü yaratmak göre. Bu cevapların bazıları tarafından çözümlenir.
  4. Dosyanın temiz bir sürüm değişiklikleri çekme, her şeyi yeniden zorunda kalmadan çalışma defterime bu değişiklikleri içeren bir yol bulmam lazım. (update)

Birkaç aşağıda konuşacağım seçenekleri kabul var, ama daha iyi kapsamlı bir çözüm bulmak zorunda. Tam bir çözüm bazı değişiklikler İPython etmek gerekebilir, ya da bazı basit dış komut güveniyor olabilir. Ben şu anda mercurial, kullanmak değil, aynı zamanda git ile çalışan bir çözüm istiyorum: ideal bir çözüm sürüm kontrol agnostik olurdu.

Bu konu birçok kez tartışıldı, ama kullanıcı açısından kesin veya net bir çözüm yok. Bu sorunun cevabı kesin bir strateji sunmalıdır. IPython kolay monte uzantısı (hatta geliştirme) yeni bir sürümünü gerekiyorsa, sorun değil.

Güncelleme:İsteğe bağlı olarak her ile .clean bir sürümünü kaydeder my modified notebook sürüm ile Gregory Crosswhite önerilerini kullanarak tasarruf oynuyorum. Bu benim kısıtlamaları en tatmin eder ama aşağıdaki çözülmemiş bırakır:

  1. Bu (ipython bir değişiklik kaynağı gerektirir. standart bir çözüm değil Basit bir uzantısı olan bu davranış ulaşmanın bir yolu var mı? İhtiyaç-Kaydet kanca çeşit.
  2. Bende bir sorun mevcut iş akışı değişiklikleri ile çekiyor. Bu .clean dosyası için gelecek, ve sonra bir şekilde çalışmak benim sürüm entegre edilmesi gerekiyor. (Tabii ki, her zaman yeniden çalıştırmak notebook edebilirim, ama bu özellikle eğer sonuçlar bazı hesaplamalar, paralel hesaplamalar, vb uzun bağlı bir ağrı olabilir.) Bu nasıl çözüleceği hakkında iyi bir fikir henüz yok. Belki de bir iş akışı ipycache gibi bir uzantısı içeren işe yarayabilir, ama bu biraz fazla karmaşık görünüyor.

Notlar

Çıkarma (soyma) Çıktı

  • Dizüstü bilgisayar çalışırken, çıkış kaldırmak için Cell/All Output/Clear menü seçeneğini kullanabilirsiniz.
  • Bu komut çıktısı çıkarın nbstripout.py gibi çıktı kaldırılması için bazı kodlar vardır, ama dizüstü bilgisayar arayüzü kullanarak aynı çıktı üretmez. Bu sonunda ipython/nbconvert repo dahil oldu, ama bu kapalı değişiklikleri şimdi ipython/ipythondahil olduğunu belirten olmuştur ama ilgili işlevleri dahil henüz değil gibi görünüyor.(update)Bu söyleniyor, Gregory Crosswhite çözüm bu oldukça kolay, hatta ipython/nbconvert bu yaklaşım eğer düzgün bağladım olabilir belki işe yarar yani çağırmadan olduğunu gösterir. (Her sürüm kontrol sistemi, ancak, onu takmak iyi bir fikir bu şekilde dizüstü mekanizması kanca gibi görünmüyor.)

Haber grupları

Sorunları

İstekleri Çekin

CEVAP
30 Aralık 2013, PAZARTESİ


Burada git benim çözüm. Bu fonksiyonu kullanarak sadece ekleme ve kaydetme (ve fark) her zamanki gibi: bu operasyon değil kişiliğini çalışan ağaç, ve aynı zamanda (re)çalışan bir notebook değil kişiliğini gıt tarihi.

Bu muhtemelen diğer VCSs adapte edilebilir olsa da, ihtiyaçlarınızı (en azından VSC agnosticity) tatmin etmediğini biliyorum. Yine de, benim için mükemmel ve hiçbir şey, özellikle parlak ve pek çok kişi zaten kullanıyor olsa da, etrafında googling tarafından nasıl uygulanacağı hakkında açık bilgiler bulamadım. Diğer insanlar için yararlı olabilir.

  1. this content ile bir dosya bir yerde (aşağıdaki için, bize ~/bin/ipynb_output_filter.py varsayalım) kaydedin
  2. Çalıştırılabilir (chmod x ~/bin/ipynb_output_filter.py)
  3. Dosyayı aşağıdaki içerikle ~/.gitattributes, oluşturun

    *.ipynb    filter=dropoutput_ipynb
    
  4. Aşağıdaki komutları çalıştırın:

    git config --global core.attributesfile ~/.gitattributes
    git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py
    git config --global filter.dropoutput_ipynb.smudge cat
    

Bitti!

Sınırlamalar:

  • git Sadece ile çalışır
  • şube somebranch ve eğer git, git checkout otherbranch; git checkout somebranch, genellikle işçi ağaç değişmeden olmasını bekliyoruz. Burada yerine çıktı ve hücreler bu iki kol arasındaki farklı olan defter numaralandırma kaybetmiş olacak.
  • daha genel olarak, çıktı, Gregory'nin çözüm olarak sürüm bilgisi yok. Sipariş için değil sadece at gitsin her zaman yaptığın bir şey içeren bir ödeme, yaklaşım olabilir değiştirilmiştir depolama ayrı dosyalar (ama dikkat edin o zaman yukarıdaki kodu çalıştırmak, işlemek kimliği bilinmemektedir!), ve muhtemelen onları sürüm (ama bu bir şey en azından git diff notebook_file.ipynb serbest kalacağını, ancak git commit notebook_file.ipynb, base64 çöp bir daha ihtiyaç olacağını fark).
  • eğer biraz çıkış içeren kod (yani başkasının işlediği bu yaklaşım kullanarak değil) çekin eğer o dedi, Bu arada, çıkış, normal olarak teslim edilir. Sadece yerel olarak üretilen çıkış kaybolur.

Benim çözümüm bizzat üretilen şeyler tutmak için sürüm bilgisi gibi yok olması birleştirir çıkış içeren yapıyor çıkış geçersiz kılmak için neredeyse garantidir dikkat edin yansıtıryaverimliliğiniziyaher ikisi de.

DÜZENLEME:

  • eğer önerilen çözüm kabul ederseniz - yani, genel - bazı gıt için repo durumunda sorun olacakistiyorumsürümü çıktı. Eğer istersenizdevre dışı bırakınçıkış belirli bir git depo için filtreleme içindeki bir dosya oluşturmak sadece.git/info/bağlıyorile

    **.= ipynb filtre

içerik olarak. Açıkçası, aynı şekilde tersini yapmak mümkündür: süzme işlemini etkinleştirsadecebelirli bir depo için.

  • kodu şimdi kendi git repo muhafaza edilir

  • talimatları İmportErrors neden yukarıda, "" komut: yol önce . ipython ekleyerek deneyin

    git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • grickle

    grickle

    22 AĞUSTOS 2006
  • ShotgunSandwichENT

    ShotgunSandw

    3 EKİM 2012
  • tsweeney79

    tsweeney79

    21 Ocak 2008