2010-09-21 11 views
19

Hay formatos que en realidad son archivos zip disimulados, p. Ej. docx u odt. Si los guardo directamente en control de versiones, se manejan como archivos binarios. Mi solución ideal seríaArchivos comprimidos que controlan la versión (docx, odt)

  • tienen un gancho que se crea un directorio foo.docx/ para cada foo.docx archivos antes de cometer, descomprimir todos los archivos en ella
  • opcionalmente, tienen un gancho que resangra los archivos xml
  • tienen un gancho foo.docx que recrea a partir de los archivos almacenados después de la actualización

no quiero el docx archivos a sí mismos bajo control de versiones. (Estoy al tanto de un related question donde se sugirió un enfoque diferente con un diff personalizado)

¿Es esto factible? ¿Es esto factible con mercurial?

ACTUALIZACIÓN:

que sé de ganchos. Estoy interesado en los detalles. Aquí hay una sesión para demostrar el comportamiento esperado.

> hg add foo.docx 
> hg status 
A foo.docx 
> hg commit 
> # Change foo.docx with external editor 
> hg status 
M foo.docx 
> hg diff 
+++ foo.docx/word/document.xml 
- <w:t>An idea</w:t> 
+ <w:t>A much better idea</w:t> 
+3

'git' tiene el comportamiento de gancho que permitirá esto, pero no sé acerca de hg – Daenyth

+2

En cuanto a su segundo punto: Tenga en cuenta que estos formatos de documento (especialmente .xslx y ODF) no tratan el espacio en blanco especificado por el estándar XML pero, sobre todo para fines prácticos, preserva el espacio en blanco, incluso si esto no está indicado.Por lo tanto, volver a encriptar un archivo puede cambiar los contenidos. –

+1

¿Por qué exactamente no quieres que los archivos de formato zip se pongan en control de revisión? ¿Cuál es el problema que quieres resolver? – Rudi

Respuesta

5

Si puede superar el obstáculo de descomprimir y comprimir con creces los documentos de Openoffice, entonces debería poder usar el filter system que tenemos en Mercurial. Eso le permite transformar archivos en cada lectura/escritura desde/hacia el repositorio.

Desgraciadamente, tendrá que hacer mucho más que simplemente descomprimir el archivo foo.docx. El problema es que necesita generar un solo archivo como salida, por lo que quizás pueda unzip foo.docx y luego tar subir los archivos generados. A continuación, estará versionando el tarball, lo que debería funcionar, ya que un tarball no es más que una concatenación no comprimida de todos los archivos individuales con algo de metainformación. Ahora que lo pienso, una solución más simple sería comprimir nuevamente el archivo foo.docx sin empaquetar, pero no especificar compresión. Eso debería dar resultados similares a usar tar.

La resolución de este problema es algo que he querido hacer yo mismo, así que informe de nuevo enviando un correo electrónico al Mercurial mailing list.

+2

Comprimir sin compresión parece funcionar tanto para odt como para archivos docx, gracias por la sugerencia. –

+0

extensión zipdoc se descomprime y luego se comprime sin compresión, y vica-versa. Estoy aquí para descubrir cómo diferenciarlos, sin embargo. Los estoy informando como un binario indivisible. –

3

Usted puede utilizar un gancho precommit para descomprimir, y un gancho de actualización de la cremallera. Consulte the definite guide sobre cómo usar los ganchos.

Tenga cuidado con el cambio de nombre. Si cambia el nombre de foo.docx a bar.docx, su gancho de precomisión deberá eliminar foo.docx/ y agregar bar.docx/.


ACTUALIZACIÓN (lo siento por dar una respuesta de nivel de entrada a un usuario 1k-rep)

Si desea utilizar docx desembalado durante las operaciones hg centrales como diff (status puede trabajar con archivo embalado), tendrías que ir con una extensión. Creo que puede adoptar un enfoque similar al keyword extension para envolver el objeto repo con el suyo.

He escrito algunas extensiones pero no en ese nivel básico, por lo que no puedo proporcionar más detalles.

Si quieres volverte loco, incluso podrías fusionarte con un archivo descomprimido. Pero probablemente sea más seguro tratarlo como binario y use external tool para diferir y fusionar.

+3

Descubrí que al menos Openoffice es muy exigente con respecto a cómo se comprimen los archivos. Un simple descomprimir-> zip ciclo puede ser suficiente para corromper un archivo .od *. – Rudi

+0

@Rudi tiene más información: ¿qué herramienta zip se utilizó ?, ¿qué pasó ?, etc. –

13

Me preguntaba lo mismo, y me encontré con la extensión/filtro ZipDoc para Mercurial, que parece hacer exactamente esto.

¡No lo he probado todavía, pero parece prometedor!

+0

¿Necesita 'hg rm' y luego volver a agregar el archivo después de haber instalado la extensión? ¡Gracias! – NHDaly

+0

@NHDaly No estoy seguro; ¡En realidad no pude probarlo! Debería ser fácil probarlo en un repositorio de prueba :-) –

+1

¿hay algo similar para git? – pjz

0

He estado luchando con este problema exacto en los últimos días y he escrito una pequeña utilidad .NET para extraer y normalizar archivos de Excel de forma que sean mucho más fáciles de almacenar en control de código fuente. He publicado el ejecutable aquí:

https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe

..y la fuente aquí:

https://bitbucket.org/htilabs/ooxmlunpack

Si hay algún interés estoy feliz de hacer esto más configurable, pero al momento, debe poner el ejecutable en una carpeta (por ejemplo, la raíz de su repositorio de origen) y cuando lo ejecute, será:

  • Escanee el archivo siguiente der y sus subcarpetas para cualquier .xlsx y archivos .xlsm
  • lleve una copia del archivo como * .orig
  • Descomprimir cada archivo y re-Zip es sin compresión
  • Pretty-impresión de los archivos en el archivo que son válidos XML
  • Elimine el archivo calcchain.xml del archivo (ya que cambia mucho y no afecta el contenido del archivo)
  • Ingrese los valores de texto sin formatear (de lo contrario, estos se guardan en una tabla de búsqueda que causa grandes cambios en el XML interno si se modifica una sola celda)
  • Eliminar los valores de cualquier células que contienen las fórmulas (ya que sólo se pueden calcular cuando la hoja está próximo abierto)
  • crear una subcarpeta * .extracted, que contiene el contenido del archivo zip extraídos

Claramente no todas estas cosas son necesarias, pero el resultado final es un archivo de hoja de cálculo que aún se abrirá en Excel pero que es mucho más compatible con la compresión diferida y incremental. Además, el almacenamiento de los archivos extraídos también hace que sea mucho más obvio en el historial de versiones qué cambios se han aplicado en cada versión.

Si hay algún apetito, me complace hacer la herramienta más configurable ya que supongo que no todos querrán que se extraiga el contenido, o posiblemente los valores eliminados de las celdas de fórmula, pero estos son muy útiles para mí en el momento.

En las pruebas, una hoja de cálculo de 2MB 'desempaqueta' a 21MB pero luego pude almacenar cinco versiones con pequeños cambios entre cada una, en un archivo de datos mercurial de 1.9MB y visualizar las diferencias entre las versiones usando Beyond Compare en modo texto.

Cuestiones relacionadas