2011-06-29 11 views
6

Nuestro IDE hecho a la medida produce archivos XML con una codificación que los hace parecer archivos binarios. Diffs y fusiones de estos archivos fallan.Para enganchar o no para enganchar - git

Podemos crear versiones ASCII de estos archivos con el comando tr. Me gustaría llegar a un estado en el que estos archivos siempre se conviertan automáticamente a ascii antes de comprometerlos.

Recogí mi copia de Version Control con Git y de todo corazón me advirtió que no use ganchos a menos que realmente lo necesite.

¿Debo usar un gancho para este propósito? ¿O puedo hacer algo más para garantizar que los archivos siempre se conviertan antes de la confirmación?

Windows XP con msysgit 1.7.4

- = update = -

Gracias a todos por su ayuda y paciencia. Mirando a this question He intentado lo siguiente, pero no funciona:

echo "*.xrp filter=xrp" > .git/info/attributes 
git config --global filter.xrp.clean 'tr -cd '\''\11\12\15\40-\176'\''' 
git config --global filter.xrp.smudge cat 
git checkout --force 

Los archivos permanecen sin cambios después de este cambio de configuración. Incluso cuando elimino y re-pago.

El comando tr configurado como la tarea de limpieza hace trabaja de forma aislada. Prueba:

$ head -n 1 cashflow/repo/C_GMM_CashflowRepo.xrp 
ÿþ< ! - - X M L R e p o s i t o r y f i l e 1 . 0 - - > 

$ tr -cd '\''\11\12\15\40-\176'\' < cashflow/repo/C_GMM_CashflowRepo.xrp | head -n 1 
<!-- XML Repository file 1.0 --> 

¿Alguien puede ver lo que está mal con mi configuración?

+0

¿Cómo se manifiesta una falla o un manifiesto de fusión? ¿De qué manera falla una fusión? – ralphtheninja

+0

Diff responde con: "los archivos binarios son diferentes". Sin embargo, es una buena pregunta, solo estoy suponiendo que la fusión fracasaría como consecuencia de no poder hacer la diferencia. De todos modos, tener la capacidad de diferencia sería agradable. – Synesso

Respuesta

5

Un problema con los ganchos es que no se distribuyen.

.gitattributes tiene alguna directiva para administrar el diff y el contenido de un archivo, pero otra opción sería una attribute filter (aún en .gitattributes), y podrían convertir automáticamente los archivos al confirmar.
(es decir, si la secuencia de comandos limpia es capaz de detect those files based on their content alone)


Por esta discusión de chat, el OP Synesso reporta un éxito:

.gitattributes: 
*.xrp filter=xrp 

~/.gitconfig: 
[filter "xrp"] 
clean = \"C:/Program Files/Git/bin/tr.exe\" -cd "\\''\\11\\12\\15\\40-\\176'\\'" 
smudge = cat 

Luego tuve que modificar el archivo, add, commit, delete, checkout ... y ENTONCES fue corregido. :)

Tenga en cuenta que, para cualquier modificación que no se refiere a un solo usuario, pero potencialmente a cualquier usuario de que la clonación Repo, prefiero añadir (y cometer) un archivo extra .gitattributes en la que se declara el filtro, en vez que la modificación del archivo .git/info/attribute (que no está clonado).

Desde el gitattributes man page:

  • Si desea afectar sólo a un único repositorio (es decir, para asignar atributos a los archivos que son particulares de flujo de trabajo de un usuario de ese repositorio), entonces los atributos deben ser colocados en el archivo $GIT_DIR/info/attributes.
  • Los atributos que deben ser controlados por versión y distribuidos a otros repositorios (es decir, atributos de interés para todos los usuarios) deben ir a los archivos .gitattributes.
  • Los atributos que deberían afectar a todos los repositorios para un solo usuario deberían colocarse en un archivo especificado mediante la opción de configuración core.attributesfile.
  • Los atributos para todos los usuarios de un sistema deben colocarse en el archivo $ (prefijo)/etc/gitattributes.

http://git-scm.com/docs/gitattributes


phyatt añade in the comments:

hice un ejemplo similar a esto para sqlite3.
Puede agregarlo a los archivos correctos con dos líneas:

git config diff.sqlite3.textconv 'sqlite3 $1 .dump' 
echo '*.db diff=sqlite3' >> $(git rev-parse --show-toplevel)/.gitattributes 

líneas similares se pueden utilizar para la escritura de otros caminos git config.

+0

Gracias. Los filtros de atributos suenan igual de interesantes. – Synesso

+0

Encontré el filtro de atributo más útil. Eventualmente llegué a esta pregunta: http://stackoverflow.com/questions/2316677/can-git-automatically-switch-between-spaces-and-tabs/2318063#2318063 - Intenté una solución pero no funciona. Pregunta actualizada – Synesso

+0

@Synesso: ¿trataste de pagar de nuevo el depósito en otro lugar? – VonC

2

¿Tiene diff posibilidad de trabajar en ellos como está (es decir, solo contienen un puñado de bytes extraños pero son texto de otra manera) o no? Si lo hace, puede obligar a git a tratarlos como texto con .gitattributes. De lo contrario, podría ser mejor crear scripts personalizados de fusión y fusión (que usarán el tr, según sea necesario para convertir) y decirle a git que lo use, de nuevo con .gitattributes.

En cualquier caso, no va a utilizar ganchos (esos son para correr en las operaciones particulares), pero .gitattributes, que son específica de archivo.

+0

Los archivos son XML, pero cuando los miro en hexdump, cada byte se intercala con 00. Como resultado, se tratan como binarios por diff. Tu solución suena muy fácil. Lo probaré mañana. – Synesso

2

Si su formato de edición preferido era ASCII y solo sus compilaciones requerían los archivos binarios, recomendaría usar reglas de compilación para generar la versión binaria de la fuente preferida que se comprometería con el repositorio.

Dado que su IDE ya hace que los archivos estén en formato binario, creo que lo mejor es almacenarlos en el repositorio en ese formato.

En lugar de ganchos, mira git help attributes, especialmente diff y textconv que le permiten configurar los archivos que cumplan ciertos patrones a utilizar medios alternativos de diffing. Debería poder generar diferencias ASCII activas sin tener que comprometer la forma de almacenar los archivos o editarlos.

EDITAR: Según su comentario en otro lugar, "cada otro byte es 0" que sugiere que el archivo es UTF-16 o UCS-2. Vea esta respuesta para un diff que puede manejar unicode: Can I make git recognize a UTF-16 file as text?

+0

Gracias. Debería haber dejado en claro que el IDE es un pastel de frutas y escribe los archivos como binarios cuando en realidad no lo son. No hay ningún beneficio en que sean binarios. ¡Gracias por tu respuesta útil! – Synesso

+0

+1 para generar los archivos XML a pedido y solo confirmar los documentos de origen de los que se genera el XML. –

+0

@Synesso basado en su comentario Agregué un enlace a una pregunta relacionada. –

Cuestiones relacionadas