Какова хорошая стратегия для хранения ноутбуков IPython под контролем версий?
Формат ноутбука вполне поддается контролю версий: если кто-то хочет управлять версиями ноутбука и выводов, это работает довольно хорошо. Раздражение возникает, когда нужно только контролировать версию входа, исключая выходные данные ячеек (иначе говоря, "продукты сборки"), которые могут быть большими двоичными объектами, особенно для фильмов и сюжетов. В частности, я пытаюсь найти хороший рабочий процесс, который:
- позволяет мне выбирать между включением или исключением вывода,
- предотвращает случайное принятие вывода, если я этого не хочу,
- позволяет мне сохранить вывод в моей локальной версии,
- позволяет мне видеть, когда у меня есть изменения во входах, используя мою систему контроля версий (то есть, если я только управляю версиями входов, но мой локальный файл имеет выходы, то я хотел бы видеть, изменились ли входы (требующий фиксации Использование команды управления версиями статуса всегда регистрирует разницу, поскольку локальный файл имеет выходные данные.)
- позволяет мне обновить мою рабочую записную книжку (которая содержит вывод) из обновленной чистой записной книжки. (Обновить)
Как уже упоминалось, если я решил включить выходные данные (что желательно при использовании nbviewer, например), то все в порядке. Проблема в том, что я не хочу, чтобы контроль версий выводился. Существуют некоторые инструменты и сценарии для удаления выходных данных ноутбука, но часто я сталкиваюсь со следующими проблемами:
- Я случайно фиксирую версию с выводом, тем самым загрязняя мой репозиторий.
- Я очищаю вывод для использования контроля версий, но на самом деле предпочитаю сохранять вывод в локальной копии (например, иногда требуется время для воспроизведения).
- Некоторые из сценариев, которые ограничивают вывод, слегка изменяют формат по сравнению с параметром меню
Cell/All Output/Clear
, создавая тем самым нежелательный шум в diffs. Это решается некоторыми ответами. - При извлечении изменений в чистую версию файла мне нужно найти способ включить эти изменения в мою рабочую тетрадь без необходимости повторного запуска. (Обновить)
Я рассмотрел несколько вариантов, которые буду обсуждать ниже, но пока не нашел хорошего комплексного решения. Полное решение может потребовать внесения некоторых изменений в IPython или использовать простые внешние сценарии. В настоящее время я использую Mercurial, но хотел бы решение, которое также работает с Git: идеальным решением будет независимость от контроля версий.
Эта проблема обсуждалась много раз, но нет определенного или четкого решения с точки зрения пользователя. Ответ на этот вопрос должен дать окончательную стратегию. Хорошо, если для этого требуется последняя версия (даже для разработки) IPython или легко устанавливаемое расширение.
Обновление: я играл с моей модифицированной версией ноутбука, которая по желанию сохраняет версию .clean
при каждом сохранении, используя предложения Грегори Кроссвайта. Это удовлетворяет большинству моих ограничений, но оставляет следующее нерешенным:
- Это еще не стандартное решение (требуется модификация исходного кода ipython. Есть ли способ добиться такого поведения с помощью простого расширения? Требуется какая-то ловушка при сохранении.
- Проблема, с которой я сталкиваюсь в текущем рабочем процессе, заключается в получении изменений. Они войдут в файл
.clean
, а затем должны быть каким-то образом интегрированы в мою рабочую версию. (Конечно, я всегда могу перезапустить ноутбук, но это может быть неприятно, особенно если некоторые результаты зависят от длинных вычислений, параллельных вычислений и т.д.) Я пока не знаю, как решить эту проблему., Возможно, рабочий процесс с таким расширением, как ipycache, мог бы работать, но это кажется слишком сложным.
Заметки
Удаление (удаление) вывода
- Когда ноутбук работает, можно использовать параметр меню
Cell/All Output/Clear
для удаления вывода. - Существуют некоторые сценарии для удаления вывода, такие как сценарий nbstripout.py, который удаляет вывод, но не выдает такой же вывод, как при использовании интерфейса ноутбука. В конечном итоге это было включено в репозиторий ipython/nbconvert, но оно было закрыто, заявив, что изменения теперь включены в ipython/ipython, но соответствующая функциональность, похоже, еще не была включена. (обновление) При этом решение Грегори Кроссвайта показывает, что это довольно легко сделать, даже без вызова ipython/nbconvert, поэтому этот подход, вероятно, работает, если его можно правильно подключить. (Однако, присоединяя его к каждой системе управления версиями), не кажется хорошей идеей - это должно как-то зацепить механизм ноутбука.)
Телеконференции
вопросы
- 977: запросы функций ноутбука (Открыть).
- 1280: Очистить все при сохранении (Открыть). (Следует из этого обсуждения.)
- 3295: автоэкспортированные записные книжки: экспортировать только явно помеченные ячейки (закрыто). Разрешено расширением 11 Добавить запись в исполняемую магию (Объединено).
Тянуть запросы
- 1621: очистить номера подсказок [] в "Очистить все выходные" (объединены). (См. Также 2519 (объединено).)
- 1563: улучшения clear_output (объединены).
- 3065: доступность тетрадей (закрыт).
- 3291: добавить опцию, чтобы пропустить выходные ячейки при сохранении. (Закрыто). Это кажется чрезвычайно актуальным, однако было закрыто с предложением использовать фильтр "чистый/грязный". Актуальный вопрос: что вы можете использовать, если хотите удалить вывод перед запуском git diff? кажется, не было ответа.
- 3312: WIP: крючки для сохранения в ноутбуке (закрыто).
- 3747: ipynb → преобразователь ipynb (закрыт). Это перебазировано в 4175 году.
- 4175: nbconvert: база экспортеров Jinjaless (объединена).
- 142: Используйте STDIN в nbstripout, если не вводится никаких данных (открыто).