Apa strategi yang baik untuk menjaga notebook IPython di bawah kendali versi?
Format notebook cukup setuju untuk kontrol versi: jika seseorang ingin mengontrol versi notebook dan output maka ini berfungsi dengan baik. Gangguan terjadi ketika seseorang hanya ingin versi mengontrol input, tidak termasuk output sel (alias. "Membangun produk") yang bisa menjadi gumpalan biner besar, terutama untuk film dan plot. Secara khusus, saya mencoba menemukan alur kerja yang baik yang:
- memungkinkan saya untuk memilih antara termasuk atau tidak termasuk output,
- mencegah saya dari sengaja melakukan output jika saya tidak menginginkannya,
- memungkinkan saya untuk menyimpan hasil dalam versi lokal saya,
- memungkinkan saya untuk melihat ketika saya memiliki perubahan dalam input menggunakan sistem kontrol versi saya (yaitu jika saya hanya versi mengontrol input tetapi file lokal saya memiliki output, maka saya ingin dapat melihat apakah input telah berubah (membutuhkan komit ). Menggunakan perintah status kontrol versi akan selalu mencatat perbedaan karena file lokal memiliki output.)
- memungkinkan saya untuk memperbarui buku catatan kerja saya (yang berisi output) dari buku catatan bersih yang diperbarui. (memperbarui)
Seperti yang disebutkan, jika saya memilih untuk memasukkan output (yang diinginkan saat menggunakan nbviewer misalnya), maka semuanya baik-baik saja. Masalahnya adalah ketika saya tidak ingin versi mengontrol output. Ada beberapa alat dan skrip untuk melepaskan output notebook, tetapi seringkali saya menghadapi masalah berikut:
- Saya tidak sengaja melakukan versi dengan output, sehingga mencemari repositori saya.
- Saya menghapus output untuk menggunakan kontrol versi, tetapi lebih suka menyimpan output dalam salinan lokal saya (kadang-kadang butuh beberapa saat untuk mereproduksi misalnya).
- Beberapa skrip yang menghapus keluaran mengubah format sedikit dibandingkan dengan
Cell/All Output/Clear
opsi menu, sehingga menciptakan kebisingan yang tidak diinginkan di diffs. Ini diselesaikan dengan beberapa jawaban. - Saat menarik perubahan ke versi file yang bersih, saya perlu menemukan beberapa cara untuk memasukkan perubahan itu di notebook saya yang bekerja tanpa harus menjalankan kembali semuanya. (memperbarui)
Saya telah mempertimbangkan beberapa opsi yang akan saya bahas di bawah, tetapi belum menemukan solusi komprehensif yang baik. Solusi lengkap mungkin memerlukan beberapa perubahan pada IPython, atau mungkin bergantung pada beberapa skrip eksternal sederhana. Saat ini saya menggunakan mercurial , tetapi ingin solusi yang juga berfungsi dengan git : solusi ideal adalah agnostik versi-kontrol.
Masalah ini telah dibahas berkali-kali, tetapi tidak ada solusi yang pasti atau jelas dari perspektif pengguna. Jawaban untuk pertanyaan ini harus memberikan strategi yang pasti. Tidak masalah jika memerlukan versi terbaru (bahkan pengembangan) dari IPython atau ekstensi yang mudah diinstal.
Pembaruan: Saya telah bermain dengan versi notebook saya yang dimodifikasi yang secara opsional menyimpan .clean
versi dengan setiap penyimpanan menggunakan saran Gregory Crosswhite . Ini memenuhi sebagian besar kendala saya tetapi membiarkan yang berikut ini tidak terselesaikan:
- Ini belum merupakan solusi standar (memerlukan modifikasi dari sumber ipython. Apakah ada cara untuk mencapai perilaku ini dengan ekstensi sederhana? Membutuhkan semacam pengait yang tersimpan.
- Masalah yang saya miliki dengan alur kerja saat ini adalah menarik perubahan. Ini akan masuk ke
.clean
file, dan kemudian perlu diintegrasikan entah bagaimana ke versi kerja saya. (Tentu saja, saya selalu dapat kembali menjalankan notebook, tetapi ini bisa menyebalkan, terutama jika beberapa hasil bergantung pada perhitungan panjang, perhitungan paralel, dll.) Saya belum memiliki ide bagus tentang bagaimana menyelesaikannya. . Mungkin alur kerja yang melibatkan ekstensi seperti ipycache mungkin berhasil, tetapi tampaknya agak terlalu rumit.
Catatan
Menghapus (stripping) Output
- Saat notebook berjalan, seseorang dapat menggunakan
Cell/All Output/Clear
opsi menu untuk menghapus output. - Ada beberapa skrip untuk menghapus output, seperti skrip nbstripout.py yang menghapus output, tetapi tidak menghasilkan output yang sama seperti menggunakan antarmuka notebook. Ini akhirnya termasuk dalam repo ipython / nbconvert , tetapi ini telah ditutup menyatakan bahwa perubahan sekarang termasuk dalam ipython / ipython , tetapi fungsi yang sesuai tampaknya belum dimasukkan. (pemutakhiran) Yang dikatakan, solusi Gregory Crosswhite menunjukkan bahwa ini cukup mudah dilakukan, bahkan tanpa menggunakan ipython / nbconvert, jadi pendekatan ini mungkin bisa diterapkan jika dapat dihubungkan dengan benar. (Melampirkannya ke setiap sistem kontrol versi, bagaimanapun, sepertinya bukan ide yang bagus - ini entah bagaimana harus terhubung ke mekanisme notebook.)
Newsgroup
Masalah
- 977: Permintaan fitur Notebook (Terbuka) .
- 1280: Hapus-semua opsi simpan (Buka) . (Mengikuti diskusi ini .)
- 3295: notebook yang diekspor secara otomatis: hanya mengekspor sel yang ditandai secara eksplisit (Tertutup) . Diselesaikan dengan ekstensi 11 Tambahkan sihir writeandexecute (Digabung) .
Tarik Permintaan
- 1621: clear In [] angka cepat pada "Bersihkan Semua Output" (Digabung) . (Lihat juga 2519 (Digabung) .)
- 1563: clear_output improvement (Digabung) .
- 3065: beda kemampuan notebook (Tertutup) .
- 3291: Tambahkan opsi untuk melewati sel output saat menyimpan. (Tertutup) . Ini tampaknya sangat relevan, namun ditutup dengan saran untuk menggunakan filter "clean / smudge". Sebuah pertanyaan yang relevan apa yang dapat Anda gunakan jika Anda ingin melepas output sebelum menjalankan git diff? sepertinya belum dijawab.
- 3312: WIP: Notebook save hooks (Closed) .
- 3747: ipynb -> ipynb transformator (Closed) . Ini dibuat kembali pada 4175 .
- 4175: nbconvert: basis eksportir Jinjaless (Digabung) .
- 142: Gunakan STDIN di nbstripout jika tidak ada input yang diberikan (Buka) .
--script
opsi, tetapi itu telah dihapus. Saya menunggu sampai kait pasca-penyelamatan diimplementasikan ( yang direncanakan ) pada titik mana saya pikir saya akan dapat memberikan solusi yang dapat diterima menggabungkan beberapa teknik.