web-dev-qa-db-fra.com

Pourquoi Git considère-t-il ce fichier texte comme un fichier binaire?

Je me demande pourquoi Git me dit ça :?

$ git diff MyFile.txt
diff --git a/MyFile.txt b/MyFile.txt
index d41a4f3..15dcfa2 100644
Binary files a/MyFile.txt and b/MyFile.txt differ

Ne sont-ils pas des fichiers texte?

J'ai vérifié les .gitattributes et il est vide. Pourquoi je reçois ce message? Je ne peux plus avoir de diffs comme avant

AJOUTÉE:

J'ai remarqué qu'il y a un @ dans les autorisations de fichier, qu'est-ce que c'est? Cela pourrait-il être la raison?

$ls -all
drwxr-xr-x   5 nacho4d  staff    170 28 Jul 17:07 .
drwxr-xr-x  16 nacho4d  staff    544 28 Jul 16:39 ..
-rw-r--r--@  1 nacho4d  staff   6148 28 Jul 16:15 .DS_Store
-rw-r--r--@  1 nacho4d  staff    746 28 Jul 17:07 MyFile.txt
-rw-r--r--   1 nacho4d  staff  22538  5 Apr 16:18 OtherFile.txt
118
nacho4d

Cela signifie simplement que lorsque git inspecte le contenu réel du fichier (il ne sait pas ) que toute extension donnée n'est pas un fichier binaire - vous pouvez utiliser le fichier d'attributs si vous voulez le dire explicitement - voir les pages de manuel).

Après avoir inspecté le contenu du fichier, il a détecté des éléments qui ne sont pas en caractères ascii de base. Étant UTF16, je pense qu’il aura des caractères "drôles", donc il pense que c’est binaire.

Il y a moyen de dire à git si vous avez des formats de caractères d'internationalisation (i18n) ou étendus pour le fichier. Je ne suis pas suffisamment au courant de la méthode exacte pour régler cela - vous devrez peut-être RT [Full] M ;-)

Édition: une recherche rapide de SO trouvé peut-être-rendu-git-reconnaître-un-utf-16 fichier-as-texte qui devrait donner vous quelques indices.

71
Philip Oakley

Si vous n'avez pas défini le type d'un fichier, Git essaie de le déterminer automatiquement et un fichier avec de très longues lignes et peut-être des caractères wide (par exemple, Unicode) est traité comme binaire. Avec le fichier .gitattributes vous pouvez définir comment Git interprète le fichier. Définir l'attribut diff manuellement permet à Git d'interpréter le contenu du fichier sous forme de texte et fera un diff habituel.

Ajoutez simplement un .gitattributes au dossier racine de votre référentiel et définissez l'attribut diff sur les chemins ou les fichiers. Voici un exemple:

src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml                      diff
*.css                                          diff

Si vous voulez vérifier si des attributs sont définis sur un fichier, vous pouvez le faire à l'aide de git check-attr

git check-attr --all -- src/my_file.txt

Une autre référence intéressante sur les attributs de Git pourrait être trouvée ici .

30
naitsirch

Git déterminera même que c'est binaire si vous avez une très longue ligne dans votre fichier texte. J'ai rompu une longue chaîne en la transformant en plusieurs lignes de code source. Soudain, le fichier est passé de «binaire» à un fichier texte visible (dans SmartGit).

Donc, ne continuez pas à taper trop à droite sans appuyer sur 'Entrée' dans votre éditeur - sinon, Git pensera plus tard que vous avez créé un fichier binaire.

17
Chris Murphy

J'avais ce problème où Git GUI et SourceTree traitaient les fichiers Java/JS comme des fichiers binaires et ne pouvaient donc pas voir la différence

La création du fichier nommé "attributs" dans le dossier .git\info avec le contenu suivant a résolu le problème.

*.Java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff

Si vous souhaitez apporter cette modification à tous les référentiels, vous pouvez ajouter un fichier d'attributs à l'emplacement suivant $ HOME/.config/git/attributs

16
Hemant

J'ai eu ce même problème après l'édition de l'un de mes fichiers dans un nouvel éditeur. Il s'avère que le nouvel éditeur utilise un codage (Unicode) différent de celui de mon ancien éditeur (UTF-8). Donc, j'ai simplement dit à mon nouvel éditeur de sauvegarder mes fichiers avec UTF-8, puis git a montré à nouveau correctement mes modifications et ne l'a pas vu comme un fichier binaire.

Je pense que le problème était simplement que git ne savait pas comment comparer des fichiers de types de codage différents. Ainsi, le type de codage que vous utilisez n'a pas vraiment d'importance, tant qu'il reste cohérent.

Je ne l'ai pas testé, mais je suis sûr que si je venais de valider mon fichier avec le nouveau codage Unicode, la prochaine fois que j'apporterais des modifications à ce fichier, il aurait montré les modifications correctement et ne l'avait pas détecté comme binaire, car il aurait alors comparé deux fichiers codés Unicode, et non un fichier UTF-8 à un fichier Unicode.

Vous pouvez utiliser une application telle que Notepad ++ pour voir et modifier facilement le type d'encodage d'un fichier texte. Ouvrez le fichier dans Notepad ++ et utilisez le menu Encodage de la barre d’outils.

9
deadlydog

J'ai eu le même problème. J'ai trouvé le fil quand je cherche une solution sur Google, mais je ne trouve toujours aucun indice. Mais je pense avoir trouvé la raison après avoir étudié, l'exemple ci-dessous expliquera clairement mon indice.

    echo "new text" > new.txt
    git add new.txt
    git commit -m "dummy"

pour le moment, le fichier new.txt est considéré comme un fichier texte.

    echo -e "newer text\000" > new.txt
    git diff

vous obtiendrez ce résultat

diff --git a/new.txt b/new.txt
index fa49b07..410428c 100644
Binary files a/new.txt and b/new.txt differ

et essayez ceci

git diff -a

vous obtiendrez ci-dessous

    diff --git a/new.txt b/new.txt
    index fa49b07..9664e3f 100644
    --- a/new.txt
    +++ b/new.txt
    @@ -1 +1 @@
    -new file
    +newer text^@
6
howard

Nous avons eu ce cas où un fichier .html était considéré comme binaire chaque fois que nous essayions d'y apporter des modifications. Très pas cool de ne pas voir les diffs. Pour être honnête, je n’ai pas vérifié toutes les solutions ici, mais ce qui a fonctionné pour nous a été le suivant:

  1. Supprime le fichier (le déplace réellement sur mon bureau) et valide Le git deletion. Git dit Deleted file with mode 100644 (Regular) Binary file differs
  2. Re-ajouté le fichier (réellement déplacéIt de mon bureau dans le projet). Git dit New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions Le fichieris est maintenant ajouté en tant que fichier texte normal

A partir de maintenant, toute modification apportée au fichier est considérée comme un diff texte normal. Vous pouvez également écraser ces commits (1, 2 et 3 étant le changement que vous effectuez), mais je préfère pouvoir voir à l'avenir ce que j'ai fait. Squashing 1 & 2 affichera un changement binaire.

3
StuFF mc

Per cette réponse utile , vous pouvez demander directement à Git pourquoi il traite un fichier de manière particulière:

cd directory/of/interest
file *

Il produit une sortie utile comme ceci:

$ file *
CR6Series_stats resaved.dat: ASCII text, with very long lines, with CRLF line terminators
CR6Series_stats utf8.dat:    UTF-8 Unicode (with BOM) text, with very long lines, with CRLF line terminators
CR6Series_stats.dat:         ASCII text, with very long lines, with CRLF line terminators
readme.md:                   ASCII text, with CRLF line terminators
3
patricktokeeffe

J'ai eu un exemple où .gitignore contenait une double séquence \r (retour chariot) par but.

Ce fichier a été identifié comme étant binaire par git. L'ajout d'un fichier .gitattributes a aidé.

# .gitattributes file
.gitignore diff
1
Erik Zivkovic

Cela est également causé (au moins sous Windows) par des fichiers texte comportant UTF-8 avec codage BOM . Changer l'encodage en normal UTF-8 immédiatement fait en sorte que Git voit le fichier comme type = text

0
Robba

Si git check-attr --all -- src/my_file.txt indique que votre fichier est marqué comme binaire et que vous ne l'avez pas défini comme binaire dans .gitattributes, recherchez-le dans /.git/info/attributes.

0
coberlin

Remplacez le fichier Aux.js par un autre nom, comme Sig.js.

L’arborescence source l’a toujours sous forme de fichier binaire, mais vous pouvez l’ajouter (étape) et la valider.

0
Oscar Zhou1989