Контроль версий ноутбуков Mathematica
Записные книжки Mathematica, конечно же, представляют собой обычные текстовые файлы - кажется разумным ожидать, что они будут хорошо работать с системой контроля версий (в моем случае это git, хотя я сомневаюсь, что конкретная система имеет значение). Но дело в том, что любой файл.nb полон информации кеша, временных меток и других различных метаданных. Масса этого.
Это означает, что возможно ограниченное управление версиями - коммиты и откаты работают нормально. Однако слияние - это катастрофа. Mathematica не откроет файл с маркерами слияния в нем, а текстовый редактор не сможет просмотреть файл.nb.
Кому-нибудь повезло поставить ноутбук под контроль версий? Как?
7 ответов
Рекомендуется отключить кэш структуры файла, который представляет собой метаданные, на которые вы ссылаетесь, когда смотрите на блокнот с помощью текстового редактора. Как вы обнаружили, это может вызвать конфликты слияния, если несколько человек редактируют один и тот же блокнот.
Это легко отключить с помощью Option Inspector. В меню Mathematica выберите " Формат" → " Инспектор параметров", в левом верхнем углу установите раскрывающийся список " Выбранная записная книжка" и найдите FileOutlineCache
в поле поиска. Установите опцию False и сохраните свой блокнот, и все должно быть готово.
Обратите внимание, что это может сделать открытие ноутбука немного медленнее, но если ноутбук не достаточно большой, вы, вероятно, не заметите разницу.
Есть хороший набор рекомендаций о том, как использовать Git для контроля версий с Mathematica на Mathematica Stack Exchange. Короче говоря, философия заключается в том, чтобы минимизировать использование ноутбуков.nb и попытаться выполнить большую часть контроля версий с помощью пакетов.m (аналогично тому, что говорят пользователи xuhdev и MMA выше). Это кажется вполне разумным, учитывая то, как работают ноутбуки.
Не совсем решение вашей проблемы слияния, но именно так мы работаем с блокнотами и контролем источников в моей команде. По сути, мы относимся к ноутбукам Mathematica так же, как к двоичным файлам. Они зарегистрированы, но:
- мы всегда сохраняем PDF-копию вместе с.nb (резервной копией для восстановления информации в случае, если по какой-то причине мы теряем возможность чтения.nb-файлов. Все еще проприетарный формат, но немного более распространенный, и есть вероятность, что и Adobe, и Wolfram не исчезнет одновременно)
- мы не допускаем слияния
- мы проверяем код только конечный продукт (представленный блокнот) вместо файла.nb.
В основном мы используем Mathematica для небольших доказательств, исследований и отрывов, поэтому вышеописанная процедура прекрасно работает для нас (наша основная документация находится в LaTeX, которая производит более дружественную документацию для нематематиков / непрограммистов)
Новая возможность заключается в использовании mathematica-notebook-filter
который анализирует записные книжки Mathematica и удаляет все выходные ячейки и метаданные, чтобы они не были зафиксированы в системе контроля версий.
В конкретном случае с git его легко интегрировать mathematica-notebook-filter
так что git автоматически очищает выходные данные и метаданные при расчете различий с помощью фильтров gitattribute. Вам нужно будет иметь mathematica-notebook-filter
фильтр установлен и добавлен к вашей переменной пути (или адаптируйте конфигурацию ниже, чтобы указать на двоичный файл) и добавьте следующую строку в ваш ~/.gitattributes
файл:
*.nb filter=dropoutput_nb
Это инструктирует git анализировать все файлы, соответствующие *.nb
с dropoutput_nb
фильтр, который определен в вашем ~/.gitconfig
как:
[filter "dropoutput_nb"]
clean = mathematica-notebook-filter
smudge = cat
Если по какой-то причине вы хотите, чтобы конкретная записная книжка Mathematica была зафиксирована со всеми выходными данными и метаданными, вы можете отключить фильтр в проекте .gitattributes
файл, добавив:
notebook_file.nb !filter
Отказ от ответственности: я являюсь автором этого инструмента. Это открытый исходный код, и отзывы (как хорошие, так и плохие) приветствуются. Вклад приветствуется на Github.
В соответствии с тем, что говорили Саймон и Кена, когда у меня были Mathematica .nb под управлением версией, я часто создавал текстовую версию только входного кода и сохранял ее с тем же именем, но с расширением.txt. Хотя это не решает проблему слияния напрямую, оно делает разумную работу по-разному и делает слияние вручную более очевидным, когда я вернусь к редактированию.nb позже. В этом формате все еще есть некоторые отличительные черты, но их НАМНОГО легче читать, чем в формате.nb.
Чтобы сгенерировать текстовый файл, я просто копирую блокнот в новый пустой блокнот (с ярлыками, Ctrl-A,C,N,V), выбираю меню Cell->Delete All Output, копирую результат (Ctrl-A,C) и вставьте результат в текстовый редактор, чтобы сохранить его. Это займет удивительно мало времени, когда вы освоите его.
Что ж, мое решение заключается не в использовании Notebook для отслеживания, а в использовании простых текстовых файлов (а не обычного текста "Notebook").
Если у вас есть записная книжка, вы можете использовать меню "Сохранить как...", чтобы сохранить текущий файл в виде простого текстового файла. Когда вам нужно загрузить его, просто откройте его с помощью Mahthematica. Отслеживание этого файла было бы намного лучше, чем отслеживание файла Notebook. Я не уверен, какие функции вы можете потерять, используя простой текстовый формат, а не Mathematica Notebook, но я до сих пор не обнаружил никаких дефектов.
Ссылка: http://www.topbug.net/blog/2013/05/02/track-mathematica-source-files-with-version-control-systems/
Вы должны получать маркеры слияния только в том случае, если система контроля версий обнаруживает изменения в одной строке несколькими пользователями.
Система управления исходным кодом добавляет маркеры, которые позволяют четко определить, где находятся конфликты, и заставляют их вручную удалять их (по мере разрешения каждого конфликта). Система контроля версий не может знать, как сделать это автоматически для вас.
Если файл является текстовым, но предназначен для чтения только программой, он может вообще не иметь символов конца строки (или очень длинных строк). Поэтому, если над таким файлом работает несколько человек, вы получите много конфликтов слияния.
Я не знаком с форматом файла nb, но в целом решение этой проблемы состоит в том, чтобы гарантировать, что одновременно над файлом работает только один человек (т.е. использовать эксклюзивный режим проверки для файлов nb).