Cómo realizar un mejor control de la versión del documento en archivos de Excel y archivos de esquema SQL

98

Estoy a cargo de varios archivos de Excel y archivos de esquema SQL. ¿Cómo debo realizar un mejor control de la versión del documento en estos archivos?

Necesito saber la parte modificada (parte diferente) en estos archivos y mantener todas las versiones como referencia. Actualmente estoy agregando la marca de tiempo en el nombre del archivo, pero encontré que parecía ineficiente.

¿Existe una forma o una buena práctica para mejorar el control de la versión de los documentos?

Por cierto, los editores me envían los archivos por correo electrónico.

Marcus Thornton
fuente
5
Puedo convertir estos archivos de Excel en archivos CSV y luego rastrearlos usando git para poder usar diff para ver la modificación. ¿Existe alguna otra buena práctica?
Marcus Thornton
Vea las otras respuestas, que creo que son mejores que la que aceptó.
nealmcb

Respuestas:

45

Dado que ha etiquetado su pregunta con Supongo que está preguntando sobre el uso de Git para esto.

Bueno, los volcados de SQL son archivos de texto normales, por lo que tiene mucho sentido rastrearlos con Git. Simplemente cree un repositorio y guárdelos en él. Cuando obtenga una nueva versión de un archivo, simplemente sobrescríbalo y confirme, Git lo resolverá todo por usted y podrá ver las fechas de modificación, verificar versiones específicas de este archivo y comparar diferentes versiones.

Lo mismo es cierto para .xlsxsi los descomprime. .xlsxLos archivos son directorios comprimidos de archivos XML (consulte ¿Cómo ensamblar correctamente un archivo xlsx válido a partir de sus subcomponentes internos? ). Git los verá como binarios a menos que los descomprima. Es posible descomprimir .xlsxy rastrear los cambios en los archivos XML individuales dentro del archivo.

También puede hacer esto con .xlsarchivos, pero el problema aquí es que el .xlsformato es binario, por lo que no puede obtener diferencias significativas de él. Pero aún podrá ver el historial de modificaciones y verificar versiones específicas.

kirelagin
fuente
4
Sí, lo sé, git. Creo que git es bueno para rastrear esquemas SQL. En cuanto a los archivos de Excel (.xlsx y .xls), debido a que son archivos binarios, rastrearlos usando git no puede mostrarme lo que se ha modificado en perspectiva humana. Esto es lo que estoy confundiendo.
Marcus Thornton
2
@MarcusThornton .xlsxes XML, por lo que debería funcionar bien. En general, no hay forma de comparar fácilmente dos .xlsarchivos. Probablemente podría agregar un gancho de confirmación previa que pondrá un .csvcerca y podrá diferenciarlos.
kirelagin
86

La respuesta que he escrito aquí se puede aplicar en este caso. Una herramienta llamada xls2txt puede proporcionar resultados legibles por humanos a partir de archivos .xls. Entonces, en resumen, debe poner esto en su archivo .gitattributes:

*.xls diff=xls

Y en el .git / config:

[diff "xls"]
    binary = true
    textconv = /path/to/xls2txt

Por supuesto, estoy seguro de que también puede encontrar herramientas similares para otros tipos de archivos, lo que la convierte en git diffuna herramienta muy útil para documentos de oficina. Esto es lo que tengo actualmente en mi .gitconfig global:

[diff "xls"]
    binary = true
    textconv = /usr/bin/py_xls2txt
[diff "pdf"]
    binary = true
    textconv = /usr/bin/pdf2txt
[diff "doc"]
    binary = true
    textconv = /usr/bin/catdoc
[diff "docx"]
    binary = true
    textconv = /usr/bin/docx2txt

El libro Pro Git tiene un buen capítulo sobre el tema: 8.2 Personalización de Git - Atributos de Git

1615903
fuente
2
no me funciona en windows7. He descargado la versión catdoc para Windows desde aquí: blog.brush.co.nz/2009/09/catdoc-windows que editar gitconfig y atributos como se describe arriba. pero todavía obtengo: diff --git a / src / Reports / src / main / etc / templates / nbcu.xls b / src / Reports / src / main / etc / templates / nbcu.xls index 2476319..1daec86 100644 Binary los archivos a / src /.../ test.xls yb / src /.../ test.xls difieren de la versión de GIT: 1.7.6.msysgit.1
katrin
¿Sigue almacenando el documento como un archivo de documento o como un archivo de texto? Si es un archivo de texto, ¿cómo se recupera el documento?
CMCDragonkai
@CMCDragonkai Esto no tiene ningún efecto sobre cómo se almacena el archivo, solo se ve afectada la salida del comando diff.
1615903
1
Entonces, ¿todavía está almacenando todo el archivo, no las diferencias?
CMCDragonkai
3
Re: xls2txt: extremadamente reacio a instalar una herramienta de código cerrado de un sitio web polaco. ¿Esto podría ser lo mismo? github.com/hroptatyr/xls2txt Sin embargo, no README ...
jcollum
22

He estado luchando con este problema exacto durante los últimos días y he escrito una pequeña utilidad .NET para extraer y normalizar archivos de Excel de tal manera que sean mucho más fáciles de almacenar en el 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, me complace hacer esto más configurable, pero en este momento, debe colocar el ejecutable en una carpeta (por ejemplo, la raíz de su repositorio de origen) y cuando lo ejecute, hará lo siguiente:

  • Escanee la carpeta y sus subcarpetas en busca de archivos .xlsx y .xlsm
  • Tome una copia del archivo como * .orig.
  • Descomprima cada archivo y vuelva a comprimirlo sin compresión.
  • Imprima con estilo cualquier archivo del archivo que sea XML válido.
  • Elimine el archivo calcchain.xml del archivo (ya que cambia mucho y no afecta el contenido del archivo).
  • Inserte cualquier valor de texto sin formato (de lo contrario, se mantienen en una tabla de búsqueda que provoca grandes cambios en el XML interno si se modifica incluso una sola celda).
  • Elimine los valores de cualquier celda que contenga fórmulas (ya que solo se pueden calcular cuando se abre la hoja).
  • Cree una subcarpeta * .extracted, que contenga el contenido del archivo zip extraído.

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 adecuado para la compresión diferencial e incremental. Además, almacenar 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 algo de apetito, me complace hacer que la herramienta sea más configurable, ya que supongo que no todos querrán que se extraiga el contenido, o posiblemente se eliminen los valores de las celdas de fórmula, pero ambos son muy útiles para mí en este momento.

En las pruebas, una hoja de cálculo de 2 MB se 'descomprime' a 21 MB, pero luego pude almacenar cinco versiones de la misma con pequeños cambios entre cada una, en un archivo de datos Mercurial de 1,9 MB, y visualizar las diferencias entre las versiones de manera efectiva usando Beyond Compare en modo texto.

NB: aunque estoy usando Mercurial, leí esta pregunta mientras investigaba mi solución y no hay nada específico de Mercurial sobre la solución, debería funcionar bien para Git o cualquier otro VCS.

Jon G
fuente
De hecho, no lo he intentado, pero supongo que lo haría; si lo intenta, sería genial saberlo
Jon G
@JonG No puedo hacer que funcione con LibreOffice y no hay una pestaña de Problemas en el repositorio de bitbucket. ¡Me encantaría contribuir si pudiéramos solucionar un problema!
Christian Droulers
Hola @ christian-droulers, he habilitado el problema en el Repo, ¡siéntete libre de agregar algo allí!
Jon G
@JonG ¡Esto se ve muy bien, tener un historial de versiones diferenciables podría ser realmente útil en muchos escenarios relacionados con documentos! Pero, ¿por qué es importante que el archivo se abra en Excel? ¿No puedes usar el archivo .orig? ¿Y cree que las normalizaciones pueden ser configurables / dinámicas para que el código también se pueda usar para docx / pptx?
Jørgen Tvedt
4

Utilice la extensión de documento abierto .fods. Es un formato de marcado XML simple y sin comprimir que tanto Excel como LibreOffice pueden abrir, y las diferencias se verán bien.

thouliha
fuente
2

Hemos creado una extensión de línea de comandos de Git de código abierto para libros de Excel: https://www.xltrail.com/git-xltrail .

En pocas palabras, la característica principal es que git difffunciona en cualquier formato de archivo de libro de trabajo para que muestre la diferencia en el contenido de VBA del libro de trabajo (en algún momento, haremos que esto funcione también para el contenido de las hojas de trabajo).

Todavía es temprano, pero podría ayudar.

Bjoern Stiel
fuente
y más de dos años después, todavía solo maneja VBA, mientras que muchas de las otras soluciones manejan toda la hoja de cálculo. En realidad, no me ha importado el contenido de VBA de una hoja de cálculo en más de una década (o más correctamente, he intentado activamente evitar tener ...).
Auspex
1

Como se menciona en el comentario de otra respuesta, los archivos .xlsx son solo XML.

Para llegar al directorio XML (que es git-able), debe "descomprimir" el archivo .xlsx en un directorio. Una forma rápida de ver esto en Windows es cambiar el nombre del archivo <nombre de archivo> .xlsx a <nombre de archivo> .zip, y verá el contenido interno. Guardaría esto junto con el binario para que cuando realice el pago, no tenga que realizar otros pasos para abrir el documento en Excel.

g19fanatic
fuente
1
Al menos la herramienta zip que uso (7-zip) permite abrir / extraer todos los archivos, no es necesario cambiarles el nombre.
Onur
1

Esta utilidad de Excel funciona muy bien para mí:

Control de versiones para Excel

Es una herramienta de control de versiones bastante sencilla para libros de trabajo y macros VBA. Una vez que confirma una versión, se guarda en un repositorio de Git en su PC. Nunca lo intenté re. Archivos de esquema SQL, pero estoy seguro de que hay una forma de evitarlo.

eriklind
fuente
Esta es la única herramienta que he encontrado que funciona con módulos integrados en archivos .xlsm. La única alternativa que conozco es ejecutar una macro para exportar cada módulo a su propio archivo, confirmarlos y luego ejecutar una macro para importarlos todos nuevamente después de extraerlos y fusionarlos. xltrailes mucho más fácil que eso.
Michael Hoffmann
0

Mi enfoque con los archivos de Excel es similar al de Jon, pero en lugar de trabajar con los datos de texto sin procesar de Excel, exporto a formatos más amigables.

Aquí está la herramienta que uso: https://github.com/stenci/ExcelToGit/tree/master

Todo lo que necesita es descargar el archivo .xlsm (haga clic en el enlace Ver sin procesar en esta página ). No olvide verificar la configuración de Excel como se describe en el archivo Léame. También puede agregar el código para exportar datos SQL a archivos de texto.

El libro de trabajo es tanto un convertidor de Excel binario a archivos de texto como un lanzador de las herramientas Git de Windows, y también se puede usar con proyectos que no están relacionados con Excel.

Mi versión de trabajo está configurada con docenas de libros de Excel. También utilizo el archivo para abrir Git-gui para proyectos que no son de Excel, simplemente agregando la carpeta git a mano.

stenci
fuente