Puis-je faire reconnaître par git un fichier UTF-16 comme texte?

je suis à la recherche D'un fichier de machine virtuelle PC (*.vmc) dans git, et après avoir fait un changement git identifié le fichier binaire et ne serait pas diff pour moi. J'ai découvert que le fichier était codé en UTF-16.

peut-on enseigner à git de reconnaître que ce fichier est du texte et de le traiter de façon appropriée?

j'utilise Git sous Cygwin, avec core.autocrlf définie sur false. Je pourrais utiliser mSysGit ou git sous UNIX, si nécessaire.

118
demandé sur Sam Stokes 2009-04-22 19:51:32

7 réponses

j'ai été aux prises avec ce problème pendant un certain temps, et je 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 git diff le ferait, mais exécute un programme diff de votre choix au lieu du GNU diff intégré . Donc, choisissez une diff multibyte-aware (dans mon cas, vim en mode diff) et utilisez simplement git difftool au lieu de git diff .

trouver" difftool " trop long à taper? Aucun problème:

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

Git rochers.

73
répondu Sam Stokes 2009-08-19 15:55:47

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

par exemple, avec les fichiers .strings D'Apple juste:

  1. créez un fichier .gitattributes à la racine de votre dépôt avec:

    *.strings diff=localizablestrings
    
  2. ajoutez ce qui suit à votre fichier ~/.gitconfig :

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

Source: Diff .fichiers de chaînes de caractères en Git (et ancien post de 2010).

51
répondu IlDan 2016-09-12 08:34:57

avez-vous essayé de définir votre .gitattributes pour le traiter comme un fichier texte?

p.ex.:

*.vmc diff

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

34
répondu Chealion 2018-04-11 18:11:18

par défaut, il semble que git ne fonctionnera pas bien avec UTF-16; pour un tel fichier, vous devez vous assurer qu'aucun CRLF traitement est fait sur elle, mais vous voulez diff et merge de travailler comme un fichier texte normal (ceci ignore si oui ou non votre terminal/éditeur peut gérer UTF-16).

mais en regardant le .gitattributes manpage , voici l'attribut personnalisé qui est binary :

[attr]binary -diff -crlf

donc il me semble que vous pourriez définir un attribut personnalisé dans votre niveau supérieur .gitattributes pour utf16 (notez que j'ajoute fusionner ici pour être sûr qu'il est traité comme du texte):

[attr]utf16 diff merge -crlf

de là, vous pourriez spécifier dans n'importe quel .gitattributes fichier quelque chose comme:

*.vmc utf16

aussi noter que vous devriez toujours être en mesure de diff un fichier, même si git pense qu'il est 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 git utilisez un outil différent pour voir les différences (via --ext-diff ), cette réponse suggère Guiffy .

mais ce que vous avez probablement besoin est juste à diff un fichier UTF-16 qui ne contient que des ASCII caractère. Une façon d'obtenir que cela fonctionne est d'utiliser --ext-diff et le script shell suivant:

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

notez que la conversion en UTF-8 peut fonctionner pour la fusion aussi, vous devez juste vous assurer que c'est fait dans les deux sens.

comme pour la sortie vers le terminal en regardant une diff d'un fichier UTF-16:

essayer de différencier comme cela se traduit en binaire ordures craché à l'écran. Si git est en utilisant GNU diff, il semble que GNU diff ne soit pas unicode.

GNU diff ne se soucie pas vraiment d'unicode, donc quand vous utilisez diff --text il ne fait que diffuser et afficher le texte. Le problème est que le terminal que vous utilisez ne peut pas gérer L'UTF-16 qui est émis (combiné avec les différences qui sont des caractères ASCII).

28
répondu Jared Oberhaus 2017-05-23 11:47:26

la Solution est de filtrer à travers cmd.exe /c "type %1" . le type de cmd fera la conversion, et vous pouvez donc l'utiliser avec la capacité textconv de git diff pour activer la diffusion de texte des fichiers UTF-16 (devrait fonctionner avec UTF-8 aussi, bien que non testé).

citation de gitattributes man page:


effectuer des diffs de texte de fichiers binaires

il est parfois souhaitable de voir la différence d'une version texte convertie de certains fichiers binaires. Par exemple, un document de traitement de texte peut être converti en une représentation de texte ASCII, et la différence du texte peut être montrée. Même si cette conversion perd de l'information, la différence qui en résulte est utile pour l'observation humaine (mais ne peut pas être appliquée directement).

l'option de configuration textconv est utilisée pour définir un programme pour effectuer une telle conversion. Le programme devrait prendre qu'un seul argument, le nom d'un fichier à convertir, et produire le texte résultant sur stdout.

par exemple, pour montrer la différence des informations exif d'un fichier au lieu des informations binaires (en supposant que vous avez l'outil exif installé), ajouter la section suivante à votre fichier $GIT_DIR/config (ou $HOME/.gitconfig fichier):

[diff "jpg"]
        textconv = exif

une solution pour mingw32 , les fans de cygwin peuvent avoir à modifier l'approche. Le problème est de passer le nom du fichier pour convertir en cmd.exe-it utilisera des slashs forward, et cmd suppose des séparateurs de répertoires backslash.

Étape 1:

créez le script d'argument unique qui fera la conversion en stdout. c:\path\to\some\script.sh:

#!/bin/bash
SED='s/\//\\\\/g'
FILE=\`echo  | sed -e "$SED"\`
cmd.exe /c "type $FILE"

Étape 2:

configure git pour pouvoir utiliser le fichier script. Dans votre git config ( ~/.gitconfig ou .git/config ou voir man git-config ), mettez ceci:

[diff "cmdtype"]
textconv = c:/path/to/some/script.sh

Etape 3:

pointer des fichiers pour appliquer ce workarond à en utilisant .gitattributes fichiers (voir l'homme gitattributes(5)):

*vmc diff=cmdtype

puis utilisez git diff sur vos fichiers.

8
répondu Gilles 2012-05-04 14:05:14

j'ai écrit un petit pilote git-diff, to-utf8 , qui devrait faciliter la différenciation des fichiers encodés non-ASCII/UTF-8. Vous pouvez l'installer en suivant les instructions ici: https://github.com/chaitanyagupta/gitutils#to-utf8 (le script to-utf8 est disponible dans le même repo).

notez que ce script exige que les commandes file et iconv soient disponibles sur le système.

4
répondu Chaitanya Gupta 2013-04-02 08:37:01

a eu ce problème sur Windows récemment, et le dos2unix et unix2dos bacs qui navire avec git pour windows a fait l'affaire. Par défaut, ils sont situés dans C:\Program Files\Git\usr\bin\ . observez que cela ne fonctionnera que si votre fichier n'a pas besoin d'être UTF-16. par exemple, quelqu'un a accidentellement encodé un fichier python en UTF-16 alors qu'il n'avait pas besoin de l'être (dans mon cas).

PS C:\Users\xxx> dos2unix my_file.py
dos2unix: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 Unix format...

et

PS C:\Users\xxx> unix2dos my_file.py
unix2dos: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 DOS format...
0
répondu Matt Messersmith 2018-07-24 15:46:20