158 votes

Puis-je faire git reconnaître un fichier UTF-16 en tant que texte ?

Je suis suivi d’un fichier de machine virtuelle Virtual PC (*.vmc) dans git, et après avoir fait un git changement identifié le fichier binaire et ne serait pas de diff de moi. J’ai découvert que le fichier est encodé en UTF-16.

Git peut être enseigné à reconnaître que ce fichier est texte et traiter de manière appropriée ?

J’utilise git sous Cygwin, avec core.autocrlf la valeur false. Je pourrais utiliser mSysGit ou git sous UNIX, si nécessaire.

92voto

Sam Stokes Points 7118

J'ai été aux prises avec ce problème pendant un certain temps, et viens de découvrir (pour moi) une solution parfaite:

$ git config --global diff.tool vimdiff      # or merge.tool to get merging too!
$ git difftool commit1 commit2

git difftool prend les mêmes arguments que l' git diff le feraient, mais exécute une diff programme de votre choix au lieu de GNU diff. Afin de choisir un multi-octets conscient des différences (dans mon cas, vim en mode diff) et il suffit d'utiliser git difftool au lieu de git diff.

Trouver "difftool" est trop long à taper? Pas de problème:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

Git rochers.

73voto

IlDan Points 4104

Il y a une solution très simple qui fonctionne hors de la boîte sur Unix.

Par exemple, avec Apple .strings fichiers

  1. créer un .gitattributes le fichier dans la racine de votre dépôt avec:

    *.strings diff=localizablestrings
    
  2. ajoutez les lignes suivantes à votre ~/.gitconfig le fichier

    [diff "localizablestrings"]
    textconv = "iconv -f utf-16 -t utf-8"
    

Les crédits vont entièrement à ce mec.

43voto

Chealion Points 762

Avez vous essayé de régler votre .gitattributes pour le traiter comme un fichier texte ?

par exemple.

*.vmc la valeur diff

Plus de détails : http://www.git-scm.com/docs/gitattributes.html

32voto

Jared Oberhaus Points 8877

Par défaut, il ressemble git ne fonctionne pas bien avec de l'UTF-16; pour un tel fichier, vous devez vous assurer qu'aucun CRLF le traitement est fait sur elle, mais vous souhaitez diff et merge à travailler comme un fichier texte (ce qui est ignorant si oui ou non votre terminal/éditeur peut gérer l'UTF-16).

Mais en regardant l' .gitattributes man, ici, c'est l'attribut personnalisé c'est - binary:

[attr]binary -diff -crlf

Il me semble donc que vous pouvez définir un attribut personnalisé dans votre haut niveau .gitattributes pour utf16 (à noter que j'ai ajouter de fusion ici pour être sûr qu'il est traité comme du texte):

[attr]utf16 diff merge -crlf

À partir de là, vous seriez en mesure de préciser dans .gitattributes le fichier de quelque chose comme:

*.vmc utf16

Notez également que vous devriez toujours être en mesure d' diff d'un fichier, même si git pense que c'est du binaire avec:

git diff --text

Modifier

Cette réponse dit essentiellement que GNU diff avec UTF-16 ou même de l'UTF-8 ne fonctionne pas très bien. Si vous voulez avoir l' git utiliser un autre outil pour voir les différences (via --ext-diff), la réponse suggère Guiffy.

Mais ce que vous avez probablement besoin est juste de diff UTF-16 fichier qui ne contient que des caractères ASCII. Un moyen d'obtenir que le travail est d'utiliser --ext-diff et le script suivant:

#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")

Notez que la conversion en UTF-8 pour la fusion ainsi, vous avez juste à vous assurer que c'est fait dans les deux directions.

Comme pour la sortie à la borne lorsque l'on regarde un diff de UTF-16 fichier:

En essayant de diff aime que les résultats de binaire ordures craché à l'écran. Si git est de l'utilisation de GNU diff, il serait semble que GNU diff n'est pas unicode.

GNU diff n'est pas vraiment à unicode, donc lorsque vous utilisez diff --texte juste diffs et les sorties du texte. Le problème est que le terminal que vous utilisez ne peut pas gérer l'UTF-16 émise (combinée avec la diff marques qui sont des caractères ASCII).

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