90 votes

Comment déterminer si Git gère un fichier en tant que binaire ou texte?

Je sais que GIT en quelque sorte détecte automatiquement si un fichier est binaire ou texte, et que gitattributes peut être utilisé pour régler manuellement si nécessaire. Mais est-il aussi un moyen de demander à GIT de savoir comment elle traite un fichier?

Donc, disons que j'ai un dépôt GIT avec deux fichiers: Un ascii.dat fichier contenant du texte brut et un binaire.dat fichier contenant aléatoire binaire des choses. Git gère la première dat fichier en tant que texte et le secondaire fichier binaire. Maintenant, je veux écrire un GIT webfrontend qui a une visionneuse pour les fichiers texte et une visionneuse pour les fichiers binaires (Affichage d'un vidage Hexadécimal par exemple). Bien sûr, je pourrais implémenter mon propre texte/binaire vérifier, mais il serait plus utile si le spectateur se fie à l'information comment GIT gère ces fichiers.

Alors, comment puis-je demander à GIT si elle traite d'un fichier texte ou binaire?

46voto

Chris Johnsen Points 50064

builtin_diff()1 appels diff_filespec_is_binary() qui demande buffer_is_binary() qui vérifie pour toute survenance de zéro octet (NUL "personnage") dans le premier 8000 octets (ou de la totalité de la longueur plus courte).

Je ne vois pas ce que cette "il est binaire?" test est explicitement exposé de commande si.

git merge-file utilise directement buffer_is_binary(), de sorte que vous pouvez être en mesure de faire usage de celui-ci:

git merge-file /dev/null /dev/null file-to-test

Il semble produire le message d'erreur comme error: Cannot merge binary files: file-to-test et les rendements d'un statut de sortie de 255 lorsque la donnée d'un fichier binaire. Je ne suis pas sûr que j'aurais besoin de s'appuyer sur ce problème bien que.

Peut-être git diff --numstat serait plus fiable:

isBinary() {
    p=$(printf '%s\t-\t' -)
    t=$(git diff --no-index --numstat /dev/null "$1")
    case "$t" in "$p"*) return 0 ;; esac
    return 1
}
isBinary file-to-test && echo binary || echo not binary

Pour les fichiers binaires, l' --numstat sortie devrait commencer avec - TAB - ONGLET, afin que nous venons de test pour cela.


1builtin_diff() a cordes, comme Binary files %s and %s differ qui doit être familier.

33voto

cstork Points 85
 git grep -I --name-only -e "" -- ascii.dat binary.dat ...
 

renverra les noms des fichiers que git interprète comme des fichiers texte.

19voto

Seth Robertson Points 13276

Je n'aime pas cette réponse, mais vous pouvez analyser la sortie de git-diff-tree pour voir si elle est binaire. Par exemple:

 git diff-tree -p 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD -- MegaCli 
diff --git a/megaraid/MegaCli b/megaraid/MegaCli
new file mode 100755
index 0000000..7f0e997
Binary files /dev/null and b/megaraid/MegaCli differ
 

par opposition à:

 git diff-tree -p 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD -- megamgr
diff --git a/megaraid/megamgr b/megaraid/megamgr
new file mode 100755
index 0000000..50fd8a1
--- /dev/null
+++ b/megaraid/megamgr
@@ -0,0 +1,78 @@
+#!/bin/sh
[…]
 

Oh, et BTW, 4b823d ... est une magie SHA qui représente l'arbre vide (il est le CSA pour un arbre vide, mais git est particulièrement conscient de cette magie).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X