remove - git tag best practices
Control de versiones de cuadernos de Mathematica (7)
Los cuadernos de Mathematica son, por supuesto, archivos de texto claro, parece razonable esperar que jueguen bien con un sistema de control de versiones (git en mi caso, aunque dudo que el sistema específico importe). Pero el hecho es que cualquier archivo .nb está lleno de información de caché, marcas de tiempo y otros metadatos surtidos. Scads de eso.
Lo que significa que es posible un control de versión limitado: los commits y los rollbacks funcionan bien. La fusión, sin embargo, es un desastre . Mathematica no abrirá un archivo con marcadores de fusión, y un editor de texto no es una forma de acceder a un archivo .nb.
¿Alguien ha tenido suerte poniendo un cuaderno bajo control de versión? ¿Cómo?
Bueno, mi solución no es el uso de Notebook para el seguimiento, sino el uso de archivos de texto plano (no el texto plano "Notebook").
Siempre que tenga un cuaderno, puede usar el menú "guardar como ..." para guardar el archivo actual como un archivo de texto sin formato. Cuando necesite cargarlo, simplemente ábralo con Mahthematica. El seguimiento de este archivo sería mucho mejor que el seguimiento de un archivo de Notebook. No estoy seguro de las características que puede perder al usar el formato de texto plano en lugar del Cuaderno de Mathematica, pero hasta el momento no he encontrado ningún defecto.
Referencia: http://www.topbug.net/blog/2013/05/02/track-mathematica-source-files-with-version-control-systems/
Hay un buen conjunto de recomendaciones sobre cómo usar Git para hacer control de versiones con Mathematica en Mathematica Stack Exchange . En resumen, la filosofía es minimizar el uso de portátiles .nb, y tratar de hacer la mayor parte del control de versiones con paquetes .m (similar a lo que xuhdev y MMA dicen anteriormente). Esto parece bastante sensato dado el manejo de los cuadernos.
No es una solución para su problema de fusión exactamente, pero así es como manejamos los notebooks y el control de fuente en mi equipo. Básicamente, tratamos las libretas de Mathematica de la misma forma que trataríamos los archivos binarios. Están registrados, pero:
- siempre guardamos una copia en PDF junto con .nb (copia de seguridad para restaurar la información en caso de que perdamos, por alguna razón, la capacidad de las lecturas de archivos .nb. Todavía formato propietario, pero un poco más extendido, y las posibilidades son tanto de Adobe como de Wolfram no desaparecerá simultáneamente)
- no permitimos fusiones
- revisamos por código solo el producto final (el cuaderno procesado) en lugar del archivo .nb.
Usamos principalmente Mathematica para pequeñas pruebas, exploraciones y desvíos, por lo que el procedimiento anterior funciona bien para nosotros (nuestra documentación principal está en LaTeX, que produce documentación más amigable para no matemáticos / no programadores)
Se recomienda desactivar la memoria caché de esquema de archivos, que es el metadato al que se refiere cuando mira el bloc de notas con un editor de texto. Como descubriste, puede causar conflictos de fusión si varias partes están editando el mismo cuaderno.
Esto se desactiva fácilmente con el Inspector de opciones. En el menú de Mathematica, vaya a Formato → Inspector de opciones ... , en la parte superior izquierda, configure el menú desplegable del alcance en Cuaderno seleccionado y busque FileOutlineCache
en el campo de búsqueda. Establezca la opción en False y guarde su computadora portátil, y debe estar todo listo.
Tenga en cuenta que esto puede hacer que los cuadernos de apertura sean un poco más lentos, pero a menos que el portátil sea bastante grande, probablemente no notará la diferencia.
Siguiendo la línea de lo que Simon y Kena decían, cuando he tenido el control de versiones de Mathematica .nb, a menudo creo una versión de texto plano del código de entrada y lo guardo con el mismo nombre pero con la extensión .txt. Si bien esto no resuelve directamente el problema de fusión, hace que difiera el trabajo de una manera razonable y hace que la fusión manual sea más obvia cuando vuelva a editar los .nb más tarde. Todavía hay algunas idiosincrasias en este formato, pero es MUCHO más fácil de leer que el formato raw .nb.
Para generar el archivo de texto, simplemente copio el cuaderno en un nuevo cuaderno en blanco (con accesos directos, Ctrl-A, C, N, V), selecciono el menú Celular-> Borrar todo, copio el resultado (Ctrl-A, C ), y pegue el resultado en un editor de texto sin formato para guardarlo. Tarda sorprendentemente poco tiempo una vez que te acostumbras.
Solo debe obtener marcadores de fusión si el sistema de control de origen detecta cambios en una sola línea por parte de múltiples usuarios.
El sistema de control de origen agrega marcadores para dejar muy claro dónde están los conflictos y para forzarlo a eliminarlos manualmente (a medida que resuelve cada conflicto). No hay forma de que un sistema de control de origen sepa cómo hacerlo automáticamente por usted.
Si el archivo es de texto, pero está diseñado para que lo lea solo un programa, es posible que no tenga caracteres de fin de línea (o líneas muy largas). Por lo tanto, si varias personas trabajan en un archivo de este tipo, obtendrá muchos conflictos de fusión.
No estoy familiarizado con el formato de archivo nb, pero en general la solución a este problema es garantizar que solo una persona trabaje en un archivo a la vez (es decir, use un modo exclusivo de extracción para archivos nb).
Una nueva posibilidad es utilizar mathematica-notebook-filter
que analiza las libretas de Mathematica y elimina todas las celdas de salida y los metadatos para que no se comprometan con el sistema de control de versiones.
En el caso específico de git, es bastante fácil integrar el mathematica-notebook-filter
para que git limpie automáticamente la salida y los metadatos al calcular diffs mediante el uso de filtros gitattribute . Necesitará tener instalado el filtro de mathematica-notebook-filter
y agregarlo a su variable de ruta (o adaptar la configuración a continuación para apuntar al binario) y agregar la siguiente línea a su archivo ~/.gitattributes
:
*.nb filter=dropoutput_nb
Esto instruye a git para que analice todos los archivos que coincidan con *.nb
con el filtro dropoutput_nb
que se define en su ~/.gitconfig
como:
[filter "dropoutput_nb"]
clean = mathematica-notebook-filter
smudge = cat
Si, por alguna razón, desea que un cuaderno específico de Mathematica se comprometa con todos los resultados y metadatos, puede desactivar el filtro en el archivo .gitattributes
del proyecto agregando:
notebook_file.nb !filter
Descargo de responsabilidad: soy el autor de esta herramienta. Es de código abierto y se agradece la retroalimentación (tanto buena como mala). Las contribuciones son bienvenidas en mathematica-notebook-filter .