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?

Nick Retallack
la source
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
Roland Smith
la source
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.

peterjc
la source
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
chestozo
la source
-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.

alpha_989
la source
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