¿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):
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:
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:
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:
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.
Respuestas:
Puede establecer una
textconv
opció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.
La próxima vez que solicite un archivo diff en un archivo zip en un repositorio, solicitará
unzip -v
en ambas versiones y el texto resultante.Ejemplo 2 :
Para archivos pdf, puede usar, por ejemplo
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):fuente
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/config
archivo de su repositorio o en su~/.gitconfig
archivo global personal , por ejemplo un comando hex diff utilizandohexdump
:A continuación, debe usar el
.gitattributes
archivo del repositorio para decirle a git qué archivos se deben usar con este comando de diferencia especial:Al igual que el
.gitignore
archivo, el.gitattributes
archivo 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.
fuente
.gitattributes
global (para ir junto con las[diff]
entradas en su global.gitconfig
). Si hace.gitattributes
que el repositorio sea local, entonces el usuario tendrá que modificar su.gitconfig
configuració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.gitconfig
debajo de[core]
agregarattributesfile = c:/users/<username>/.gitattributes
o donde desee almacenarlo si lo hace global (tenga en cuenta las barras hacia adelante, incluso en ventanas).Si desea forzar a git a mostrar los archivos binarios diff como una
--text
opción de uso de texto sin formato de la siguiente manera:fuente
Lo anterior son formas completas de hacerlo. Sin embargo, si solo necesita hacerlo para algunos archivos, el siguiente método es el que utilizo:
Aquí estoy usando
vimdiff
pero 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.fuente