web-dev-qa-db-fra.com

Comment puis-je comparer les fichiers binaires dans git?

Je suppose que je dois mettre en place un difftool. Qu'est-ce que difftools fonctionne? Comment mettez-vous les paramètres?

23
Nick Retallack

Vous pouvez définir une option textconv config pour un type de fichier. Voir "Réalisation de différences de texte de fichiers binaires" dans gitattributes (5) . Ce que vous devez utiliser dépend du type de fichier.

Exemple 1 :

Supposons que vous souhaitiez différencier le contenu des fichiers Zip. Dans ce cas, vous devez placer les éléments suivants dans le fichier $ GIT_DIR/config ou $ HOME/.gitconfig.

[diff "Zip"]
    textconv = unzip -v

La prochaine fois que vous demanderez un diff sur un fichier Zip dans un référentiel, il appellera unzip -v sur les deux versions et différera le texte obtenu.

Exemple 2 :

Pour les fichiers pdf, vous pouvez utiliser par exemple pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Exemple 3 :

S'il n'y a pas d'utilitaire d'informations spécifique pour un type de fichier, vous pouvez par exemple utilisez hexdump (fourni avec FreeBSD et OSX, également disponible sous Linux):

[diff "bin"]
    textconv = hexdump -v -C
21
Roland Smith

La réponse de Roland Smith était utile mais est actuellement incomplète (voir les commentaires). Elle comporte deux parties.

Vous pouvez définir une nouvelle commande diff dans le fichier .git/config de votre référentiel ou dans votre fichier global personnel ~/.gitconfig, par exemple une commande hexadécimale utilisant la variable hexdump:

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

Ensuite, vous devez utiliser le fichier .gitattributes du référentiel pour indiquer à git quels fichiers doivent être utilisés avec cette commande diff spéciale:

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

Comme le fichier .gitignore, le fichier .gitattributes doit être archivé dans votre référentiel.

Dans mon cas, j'ai plusieurs extensions de fichier différentes que je veux traiter comme étant binaires (par exemple, éviter toute conversion de fin de ligne si vous utilisez git sous Windows), ainsi que les différences éventuelles via hexdump:

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

Voir aussi https://github.com/resin-io/etcher/pull/1367 pour un autre exemple définissant une commande hexdump diff à utiliser avec des fichiers image.

8
peterjc

Si vous voulez forcer git à afficher les fichiers binaires diff sous forme de diff en texte brut, utilisez l'option --text comme ceci:

git diff --text
2
chestozo