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