Comment puis-je différencier des fichiers binaires dans git?


28

Afin de différencier les fichiers binaires dans git, je suppose que je dois configurer un outil diff.

Quels outils difftools fonctionnent? Comment placez-vous les paramètres?


Quel type de sortie espérez-vous obtenir d'un outil de diff d'un fichier binaire? De quel type de fichier binaire s'agit-il? Est-ce quelque chose qui peut être rendu au format texte puis comparé?
Zoredache

Réponses:


22

Vous pouvez définir une textconvoption de configuration pour un type de fichier. Voir "Exécution 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 mettre ce qui suit 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 repo, il appellera unzip -vles deux versions et diff le texte résultant.

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'information spécifique pour un type de fichier, vous pouvez par exemple utiliser hexdump(livré avec FreeBSD et OSX, également disponible sur Linux):

[diff "bin"]
    textconv = hexdump -v -C

Je pourrais le différencier en hex. Je serais assez content de savoir combien d'octets sont différents ou à quelles positions les octets diffèrent. J'ai fini par utiliser Hex Fiend en clonant mon référentiel git pour pouvoir vérifier les deux versions du fichier, car je n'arrivais pas à trouver comment obtenir git pour lancer le programme.
Nick Retallack

@NickRetallack: voir les exemples ajoutés.
Roland Smith

2
J'ai ajouté l'exemple 3 à ma configuration git, mais quand je fais "git diff", il me donne toujours le même message court: "Les fichiers binaires a / file et b / file diffèrent"
Nick Retallack

1
Si vous voulez utiliser libmagic, vous devrez regarder dans le code source de git pour voir si cela fonctionne ...
Roland Smith

5
J'ai finalement réussi à le faire fonctionner, après avoir ajouté * .bin diff = bin à mes .gitattributes
Justin Rowe

11

La réponse de Roland Smith a été utile mais est actuellement incomplète (voir les commentaires) - il y a deux parties à cela.

Vous pouvez définir une nouvelle commande diff dans le .git/configfichier de votre référentiel ou votre ~/.gitconfigfichier global personnel , par exemple une commande hex diff en utilisant hexdump:

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

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

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

Comme le .gitignorefichier, le .gitattributesfichier doit être archivé dans votre référentiel.

Dans mon cas, j'ai plusieurs extensions de fichiers différentes que je veux traiter comme binaires (par exemple, évitez toute conversion de fin de ligne si vous utilisez git sous Windows), et voyez également toutes les différences 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 diff hexdump à utiliser avec des fichiers image.


Vous pouvez également définir .gitattributesglobalement (pour accompagner les [diff]entrées dans votre global .gitconfig). Si vous effectuez le .gitattributeslocal sur le référentiel, l'utilisateur devra modifier ses .gitconfigparamètres de référentiel local car, pour des raisons de sécurité, ceux-ci ne seront pas poussés vers la télécommande. Dans tous les cas, chaque utilisateur doit mettre à jour ses fichiers / config locaux pour activer ce comportement. Dans .gitconfigunder [core]add attributesfile = c:/users/<username>/.gitattributesou où vous voulez le stocker si vous le rendez global (notez les barres obliques, même dans les fenêtres).
LightCC

10

Si vous voulez forcer git à afficher les fichiers binaires diff comme une --textoption d' utilisation de diff en texte brut comme ceci:

git diff --text

-1

Ce qui précède est un moyen complet de le faire .. cependant, si vous avez juste besoin de le faire pour quelques fichiers, la méthode suivante est celle que j'utilise:

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

Ici, j'utilise vimdiffmais vous pouvez utiliser n'importe quel autre outil. Ce qui précède peut également être combiné dans un petit script si vous avez besoin de le faire encore et encore.


Cela semble avoir annulé les modifications apportées à mon fichier (et créé un fichier vide où je voulais que la version validée soit).
Erhannis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.