Personaliza Git Diff: Crea tus propios drivers

Fuentes: How to build a `git diff` driver · Jamie Tanna | Software Engineer

Este artículo explica cómo crear un "driver" para git diff, una funcionalidad que permite a Git utilizar herramientas externas para comparar archivos de manera más inteligente y personalizada. Aunque la documentación oficial sobre esto es escasa, el artículo detalla el proceso, motivado por la necesidad de comparar archivos binarios o formatos específicos (como OpenAPI specs) de una forma más legible que la conversión a texto estándar (textconv).

¿Cómo funciona? Cuando Git necesita comparar dos versiones de un archivo, puede invocar un programa externo (el "driver") y pasarle información relevante. En lugar de simplemente mostrar las diferencias de bytes, el driver puede interpretar el contenido del archivo y generar una salida más comprensible. Git pasa 7 argumentos al driver: el nombre del archivo en el repositorio, la versión "antes" (antes de la modificación), el hash SHA-1 de la versión "antes", el modo octal de la versión "antes", la versión "después", el hash SHA-1 de la versión "después" y el modo octal de la versión "después". Cuando un archivo se crea o se elimina, se utilizan /dev/null y puntos (.) para indicar la ausencia de una versión.

Casos de uso: El ejemplo más claro es el uso con oasdiff, una herramienta para comparar especificaciones OpenAPI. El driver permite a Git invocar oasdiff para generar un informe de cambios legible en lugar de una comparación binaria. Esto es útil para desarrolladores que trabajan con APIs y necesitan entender los cambios realizados en las especificaciones.

Consideraciones: Es importante manejar correctamente los argumentos que Git pasa al driver, especialmente cuando se trata de archivos nuevos o eliminados. También se puede verificar la variable de entorno GIT_PAGER_IN_USE para determinar si el driver debe manejar argumentos regulares o los argumentos específicos de Git. Una optimización posible es usar los hashes SHA-1 para cachear los resultados de las comparaciones, evitando recalcular la diferencia cada vez. Finalmente, aunque el textconv es suficiente para muchos casos, un driver personalizado ofrece mayor flexibilidad para formatos de archivo complejos o binarios.