¿Cómo puedo diferenciar archivos binarios en git?

28

Para diferir archivos binarios en git, supongo que necesito configurar un difftool.

¿Qué herramientas de trabajo funcionan? ¿Cómo se ponen los parámetros?

Nick Retallack
fuente
¿Qué tipo de salida espera obtener de una herramienta diff de un archivo binario? ¿Qué tipo de archivo binario es este? ¿Es algo que se puede representar en un formato de texto y luego comparar?
Zoredache

Respuestas:

22

Puede establecer una textconvopción de configuración para un tipo de archivo. Consulte "Realización de diferencias de texto de archivos binarios" en gitattributes (5) . Lo que debe usar depende del tipo de archivo.

Ejemplo 1 :

Digamos que desea diferenciar el contenido de los archivos zip. En ese caso, debe poner lo siguiente en el archivo $ GIT_DIR / config o $ HOME / .gitconfig.

[diff "zip"]
    textconv = unzip -v

La próxima vez que solicite un archivo diff en un archivo zip en un repositorio, solicitará unzip -ven ambas versiones y el texto resultante.

Ejemplo 2 :

Para archivos pdf, puede usar, por ejemplo pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Ejemplo 3 :

Si no hay una utilidad de información específica para un tipo de archivo, podría usar, por ejemplo, hexdump(viene con FreeBSD y OSX, también disponible en Linux):

[diff "bin"]
    textconv = hexdump -v -C
Roland Smith
fuente
Podría diferenciarlo en hexadecimal. Me encantaría saber cuántos bytes son diferentes o en qué posiciones difieren los bytes. Terminé usando Hex Fiend clonando mi repositorio git para poder ver ambas versiones del archivo, porque no podía encontrar la manera de obtener git para iniciar el programa.
Nick Retallack
@NickRetallack: ver ejemplos agregados.
Roland Smith
2
Agregué el Ejemplo 3 a mi configuración de git, pero cuando hago "git diff" todavía me da el mismo mensaje corto: "Los archivos binarios a / file y b / file difieren"
Nick Retallack
1
Si quieres usar libmagic, tendrás que buscar en el código fuente de git para ver si eso funciona ...
Roland Smith
55
Finalmente conseguí que esto funcionara, después de agregar * .bin diff = bin a mis .gitattributes
Justin Rowe
11

La respuesta de Roland Smith fue útil, pero actualmente está incompleta (vea los comentarios): hay dos partes en esto.

Puede definir un nuevo comando diff en el .git/configarchivo de su repositorio o en su ~/.gitconfigarchivo global personal , por ejemplo un comando hex diff utilizando hexdump:

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

A continuación, debe usar el .gitattributesarchivo del repositorio para decirle a git qué archivos se deben usar con este comando de diferencia especial:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

Al igual que el .gitignorearchivo, el .gitattributesarchivo debe registrarse en su repositorio.

En mi caso, tengo varias extensiones de archivo diferentes que quiero tratar como binarias (por ejemplo, evitar las conversiones de final de línea si se usa git en Windows), y también veo diferencias a través de hexdump:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

Consulte también https://github.com/resin-io/etcher/pull/1367 para ver otro ejemplo que define un comando hexdump diff para usar con archivos de imagen.

Peterjc
fuente
También puede configurar el .gitattributesglobal (para ir junto con las [diff]entradas en su global .gitconfig). Si hace .gitattributesque el repositorio sea local, entonces el usuario tendrá que modificar su .gitconfigconfiguración de repositorio local porque, por razones de seguridad, no se enviarán al control remoto. De cualquier manera, cada usuario tiene que actualizar sus archivos / configuraciones locales de alguna manera para habilitar este comportamiento. En .gitconfigdebajo de [core]agregar attributesfile = c:/users/<username>/.gitattributeso donde desee almacenarlo si lo hace global (tenga en cuenta las barras hacia adelante, incluso en ventanas).
LightCC
10

Si desea forzar a git a mostrar los archivos binarios diff como una --textopción de uso de texto sin formato de la siguiente manera:

git diff --text
chestozo
fuente
-1

Lo anterior son formas completas de hacerlo. Sin embargo, si solo necesita hacerlo para algunos archivos, el siguiente método es el que utilizo:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

Aquí estoy usando vimdiffpero puedes usar cualquier otra herramienta. Lo anterior también se puede combinar en un pequeño script si necesita hacer esto una y otra vez.

alpha_989
fuente
Esto parece haber descartado los cambios en mi archivo (y creado un archivo vacío donde quería que estuviera la versión confirmada).
Erhannis