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.
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.
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:
-
créez un fichier
.gitattributes
à la racine de votre dépôt avec:*.strings diff=localizablestrings
-
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).
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 .
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).
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.
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.
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...