Je suis le suivi d'un fichier de machine virtuelle Virtual PC (* .vmc) dans git, et après avoir apporté une modification, git a identifié le fichier comme binaire et ne le différait pas pour moi. J'ai découvert que le fichier était encodé en UTF-16.
Peut-on apprendre à git à reconnaître que ce fichier est du texte et à le gérer de manière appropriée?
J'utilise git sous Cygwin, avec core.autocrlf défini sur false. Je pourrais utiliser mSysGit ou git sous UNIX, si nécessaire.
Il existe une solution très simple qui fonctionne hors de la boîte sur Unices.
Par exemple, avec les
.strings
fichiers Apple simplement:Créez un
.gitattributes
fichier à la racine de votre référentiel avec:Ajoutez ce qui suit à votre
~/.gitconfig
fichier:Source: fichiers Diff .strings dans Git (et ancien post de 2010).
la source
iconv
est "un autre outil" de la même manière que Vim ou Beyond Compare (ne fait pas partie de la suite git).vimdiff
eticonv
sont tous deux déjà présents sur macOS, vous n'avez donc pas besoin de vous demander où les obtenir, et ils font le travailAvez-vous essayé de configurer votre
.gitattributes
pour le traiter comme un fichier texte?par exemple:
Plus de détails sur http://www.git-scm.com/docs/gitattributes.html .
la source
set
etdiff
...*.vmc diff
,*.sql diff
etc. est nécessaire pour définir l'attribut 'diff' pour le chemin spécifié. (Je ne peux pas modifier la réponse). 2 mises en garde cependant: les diffs sont affichés avec un espace entre chaque caractère, et il n'est pas possible de "mettre en scène un morceau" ou de "supprimer un morceau" pour ces fichiers problématiques.Par défaut, il semble
git
ne pas fonctionner correctement avec UTF-16; pour un tel fichier, vous devez vous assurer qu'aucunCRLF
traitement n'est effectué dessus, mais que vous le souhaitezdiff
etmerge
qu'il fonctionne comme un fichier texte normal (cela ne tient pas compte du fait que votre terminal / éditeur peut ou non gérer UTF-16).Mais en regardant la
.gitattributes
page de manuel , voici l'attribut personnalisé qui estbinary
:Il me semble donc que vous pourriez définir un attribut personnalisé dans votre niveau supérieur
.gitattributes
pourutf16
(notez que j'ajoute la fusion ici pour être sûr qu'il est traité comme du texte):À partir de là, vous pourrez spécifier dans n'importe quel
.gitattributes
fichier quelque chose comme:Notez également que vous devriez toujours pouvoir accéder à
diff
un fichier, même si vous pensezgit
qu'il est binaire avec:Éditer
Cette réponse dit essentiellement que GNU diff avec UTF-16 ou même UTF-8 ne fonctionne pas très bien. Si vous souhaitez
git
utiliser un outil différent pour voir les différences (via--ext-diff
), cette réponse suggère Guiffy .Mais ce dont vous avez probablement besoin, c'est simplement d'
diff
un fichier UTF-16 qui ne contient que des caractères ASCII. Une façon de faire fonctionner cela est d'utiliser--ext-diff
et le script shell suivant:Notez que la conversion en UTF-8 peut également fonctionner pour la fusion, il vous suffit de vous assurer que cela se fait dans les deux sens.
Quant à la sortie vers le terminal lors de la recherche d'un diff d'un fichier UTF-16:
GNU diff ne se soucie pas vraiment de l'unicode, donc quand vous utilisez diff --text, il diffère simplement et produit 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 marques de différence qui sont des caractères ASCII).
la source
La solution est de filtrer
cmd.exe /c "type %1"
. La fonctiontype
intégrée de cmd effectuera la conversion, et vous pouvez donc l'utiliser avec la capacité textconv de git diff pour activer la différence de texte des fichiers UTF-16 (devrait également fonctionner avec UTF-8, bien que non testé).Citation de la page de manuel gitattributes:
Effectuer des différences de texte sur des fichiers binaires
Parfois, il est souhaitable de voir le diff d'une version convertie en texte de certains fichiers binaires. Par exemple, un document de traitement de texte peut être converti en une représentation de texte ASCII et le diff du texte affiché. Même si cette conversion perd certaines informations, la différence résultante est utile pour la visualisation 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 doit prendre un seul argument, le nom d'un fichier à convertir, et produire le texte résultant sur stdout.
Par exemple, pour afficher la différence des informations exif d'un fichier au lieu des informations binaires (en supposant que l'outil exif soit installé), ajoutez la section suivante à votre
$GIT_DIR/config
fichier (ou$HOME/.gitconfig
fichier):Une solution pour mingw32 , les fans de cygwin devront peut-être modifier l'approche. Le problème est de passer le nom de fichier à convertir en cmd.exe - il utilisera des barres obliques et cmd suppose des séparateurs de répertoire anti-slash.
Étape 1:
Créez le script d'argument unique qui effectuera la conversion en stdout. c: \ chemin \ vers \ certains \ script.sh:
Étape 2:
Configurez git pour pouvoir utiliser le fichier de script. Dans votre configuration git (
~/.gitconfig
ou.git/config
ou voirman git-config
), mettez ceci:Étape 3:
Indiquez les fichiers auxquels appliquer ce workarond en utilisant des fichiers .gitattributes (voir man gitattributes (5)):
puis utilisez
git diff
sur vos fichiers.la source
cmd //c type "${1//\//\\}"
.textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
git a récemment commencé à comprendre les encodages tels que utf16. Consultez la documentation de gitattributes , recherchez
working-tree-encoding
[Assurez-vous que votre page de manuel correspond, car c'est assez nouveau!]
Si (disons) le fichier est UTF-16 sans BOM sur une machine Windows, ajoutez-le à votre
.gitattributes
fichierSi UTF-16 (avec bom) sur * nix, faites-le:
(Remplacez
*.vmc
par*.whatever
pourwhatever
les fichiers de type que vous devez gérer)Voir: Prise en charge de l'encodage de l'arbre de travail "UTF-16LE-BOM" .
Ajouté plus tard
Suite à @Hackslash, on peut trouver que c'est insuffisant
Pour obtenir de belles différences de texte dont vous avez besoin
Mettre les deux fonctionne aussi bien
Mais c'est sans doute
eol=...
impliquetext
Le problème
Git a un macro-attribut
binary
qui signifie-text -diff
. Le contraire+text +diff
n'est pas disponible intégré mais git donne les outils (je pense!) Pour le synthétiserLa solution
Git permet de définir de nouveaux attributs de macro.
Je proposerais que le haut du
.gitattributes
fichier que vous avezEnsuite, pour tous les chemins qui doivent être du texte et des différences, faites
Notez que dans la plupart des cas, nous souhaitons l'encodage par défaut (utf-8) et l'eol par défaut (natif) et peuvent donc être supprimés.
La plupart des lignes devraient ressembler à
Pourquoi ne pas simplement utiliser diff?
Pratique: dans la plupart des cas, nous voulons des eol natifs. Ce qui veut dire non
eol=...
. Donctext
, ne sera pas implicite et doit être mis explicitement.Conceptuel: Texte Vs binaire est la distinction fondamentale. eol, encoding, diff, etc. n'en sont que quelques-uns.
Avertissement
En raison des moments bizarres dans lesquels nous vivons, je n'ai pas de machine avec un git de travail actuel. Je suis donc incapable pour le moment de vérifier le dernier ajout. Si quelqu'un trouve quelque chose qui ne va pas, j'effacerai / supprimerai.
la source
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
seul vous n'avez pas eu de jolis textes diffs? Pouvez-vous s'il vous plaît vérifier que les deuxtext
et quediff
tout fonctionne bien? Dans ce cas, je ferai une recommandation différentetext
seul entraîne une comparaison binaire. Je peux fairediff
outext diff
et ça marche. J'avais besoin d'ajouter-BOM
simplement parce que mon fichier avait une nomenclature, YMMV.J'ai écrit un petit pilote git-diff
to-utf8
, qui devrait faciliter la diffusion de tous les fichiers encodés non ASCII / UTF-8. Vous pouvez l'installer en utilisant les instructions ici: https://github.com/chaitanyagupta/gitutils#to-utf8 (leto-utf8
script est disponible dans le même référentiel).Notez que ce script nécessite que les commandes
file
eticonv
soient disponibles sur le système.la source
J'ai eu ce problème sur Windows récemment, et les bins
dos2unix
etunix2dos
fournis avec git pour Windows ont fait l'affaire. Par défaut, ils se trouvent dansC:\Program Files\Git\usr\bin\
. Notez 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'en avait pas besoin (dans mon cas).et
la source