2010-05-12 17 views
63

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.Control de versiones de cuadernos de Mathematica

Lo que significa que el control de versiones limitadas es posible; los commits y las reversiones 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 portátil bajo control de versión? ¿Cómo?

+0

No hay mucho que pueda hacer acerca de los verdaderos conflictos de combinación, donde dos personas realmente editan la misma cosa de manera conflictiva. Como dices, Mathematica no puede abrir el archivo con marcadores de conflicto (o hacer un diff de tres vías internamente), por lo que tendrás que resolverlos tú mismo en el formulario de texto. Sin embargo, la respuesta de Michael Pilat debería ayudar con los conflictos de metadatos. – Cascabel

+0

no está familiarizado con mathematica aquí - ¿se generan automáticamente los archivos .nb? si es así, no los ponga bajo control de versión. – hasen

+0

@hasen j: los archivos .nb no se autogeneran por completo, sino que contienen metadatos generados automáticamente. Creo que la respuesta de Michael Pilat ahora aclara la confusión sobre esto. – dreeves

Respuesta

43

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 Opción Inspector ..., en la parte superior izquierda establecer el alcance desplegable para seleccionada Notebook y la búsqueda de 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 la apertura de los portátiles sea un poco más lenta, pero a menos que el portátil sea bastante grande, probablemente no notará la diferencia.

+0

Gracias! No resuelve todo mi problema, pero me lleva la mayor parte del camino. Trataré de evitar tener que fusionar los contenidos de la celda real, y lo revisaré en un editor de texto si es absolutamente necesario. :) – Etaoin

+6

Otra opción que es posible que desee desactivar es TrackCellChangeTimes – krawyoti

+5

También es útil las opciones del menú 'Celda -> Eliminar todas las salidas' e' Historial del cuaderno'. El paquete 'AuthorTools' tiene' NotebookDiff' que podría engancharse en el comando diff de un VCS. Finalmente, hay un – Simon

0

Solo debe obtener marcadores de fusión si el sistema de control de origen detecta cambios en una sola línea por parte de varios usuarios.

El sistema de control de fuente 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 ser leído solo por 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 asegurar que solo una persona trabaje en un archivo a la vez (es decir, use un modo de extracción exclusivo para archivos nb) .

+3

El formato del archivo es importante para la pregunta. En la práctica, no es especialmente larga. El problema, como mencioné, es que está lleno de metadatos. Sé de qué se trata el proceso de fusión, pero en su mayor parte no estamos tratando el problema de reconciliar dos versiones del código; en su mayor parte, el conflicto está en los metadatos, y no creo nos importa qué versión tomamos. En los casos en que tenemos que fusionar el código a mano, la pregunta es sobre formas útiles de hacerlo. El pago exclusivo es la respuesta obvia, pero espero mantenerlo como último recurso. – Etaoin

6

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 registramos, pero:

  • siempre tenemos una copia en pdf junto al .nb (copia de seguridad para restaurar la información en caso de que perdemos, por alguna razón, la capacidad de los archivos de lecturas .nb Aún propietaria. formato, pero un poco más extendida, y es probable que tanto Adobe y Wolfram no desaparecerán de forma simultánea)
  • que no permiten fusiones
  • que el código de revisión sólo el producto final (la portátil prestado) en lugar del .nb archivo.

mayoría Utilizamos Mathematica para las pequeñas pruebas, exploraciones y desvíos, por lo que el procedimiento anterior funciona bien para nosotros (nuestra documentación principal está en látex, que produce la documentación más amigable para los no matemáticos/no-programadores)

3

En la línea de lo que Simon y Kena decían, cuando tengo el .nb de Mathematica bajo control de versiones, a menudo creo una versión de texto simple de solo el código de entrada y lo guardo con el mismo nombre pero una 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, acabo de copiar el bloc de notas en un nuevo cuaderno en blanco (con accesos directos, Ctrl-A, C, N, V), seleccione el menú Cell-> Eliminar todo de salida, copiar el resultado (Ctrl -A, C), y pegue el resultado en un editor de texto plano para guardarlo. Tarda sorprendentemente poco tiempo una vez que te acostumbras.

1

Bueno, mi solución no es usar Notebook para rastrear, sino usar archivos de texto sin formato (no el texto sin formato "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/

10

Hay un buen conjunto de recomendaciones para el uso de Git que ver con el control de versiones de 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.

1

Una nueva posibilidad es utilizar mathematica-notebook-filter que analiza cuadernos de Mathematica y tiras de todas las células de salida y metadatos de manera que éstos no están comprometidos en el sistema de control de versiones.

En el caso específico de git, es bastante fácil integrar mathematica-notebook-filter para que git limpie automáticamente la salida y los metadatos al calcular diffs mediante el uso de gitattribute filters. Usted tendrá que tener mathematica-notebook-filter filtro instalado y se añade a la variable de ruta (o adaptar la configuración siguiente para el punto al binario) y añadir la siguiente línea a su ~/.gitattributes archivo:

*.nb filter=dropoutput_nb 

Esto indica a Git para analizar todos los archivos a juego *.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, usted quiere tener un cuaderno de Mathematica específico cometido en todas las salidas y los metadatos, se puede desactivar el filtro en el proyecto de .gitattributes archivo agregando:

notebook_file.nb !filter 

responsabilidad: yo 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 Github.