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):
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:
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:
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:
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.
Réponses:
Vous pouvez définir une
textconv
option 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.
La prochaine fois que vous demanderez un diff sur un fichier zip dans un repo, il appellera
unzip -v
les deux versions et diff le texte résultant.Exemple 2 :
Pour les fichiers pdf, vous pouvez utiliser par exemple
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):la source
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/config
fichier de votre référentiel ou votre~/.gitconfig
fichier global personnel , par exemple une commande hex diff en utilisanthexdump
:Ensuite, vous devez utiliser le
.gitattributes
fichier du référentiel pour indiquer à git quels fichiers doivent être utilisés avec cette commande spéciale diff:Comme le
.gitignore
fichier, le.gitattributes
fichier 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.
la source
.gitattributes
globalement (pour accompagner les[diff]
entrées dans votre global.gitconfig
). Si vous effectuez le.gitattributes
local sur le référentiel, l'utilisateur devra modifier ses.gitconfig
paramè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.gitconfig
under[core]
addattributesfile = c:/users/<username>/.gitattributes
ou où vous voulez le stocker si vous le rendez global (notez les barres obliques, même dans les fenêtres).Si vous voulez forcer git à afficher les fichiers binaires diff comme une
--text
option d' utilisation de diff en texte brut comme ceci:la source
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:
Ici, j'utilise
vimdiff
mais 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.la source