web-dev-qa-db-fra.com

git, msysgit, accents, utf-8, les réponses définitives

J'ai lu à certains endroits qu'il y a des problèmes avec git (ou simplement msysgit?) Et l'encodage des caractères - I croire ce n'est qu'un problème dans les noms de fichiers.

Ce que j'aimerais, ce sont des informations "définitives" (ou du moins faisant autorité) sur:

  1. Quels sont exactement les "problèmes"? (Les symptômes)
  2. Quelles en sont les causes? (Brièvement)
  3. Dans quels scénarios est-ce un bouchon de spectacle?
  4. Y a-t-il une résolution en vue ou, à défaut, des solutions de contournement?

J'espère que cette question n'est pas trop vague, je pense que ce serait bien d'avoir toutes ces informations en un seul endroit pour pouvoir pointer les gens vers elle ...

46
Benjol

Mise à jour février 2017 (Git 2.12): la table de largeur des caractères a été mise à jour pour correspondre à Unicode 9.0 .
Le update_unicode.sh est déplacé dans contrib/update-unicode : voir son README .

Mise à jour d'août 2014 (git 2.1): commit a67c821 ( Torsten Bögershausen (tboegi) ) ajoute la prise en charge d'Unicode 7.0.

Mise à jour d'avril 2014: commit d813ab9 ( Torsten Bögershausen (tboegi) ) ajoute la prise en charge d'Unicode 6.3
(git 1.9.2):

Unicode 6.3 définit plus de points de code comme une combinaison ou des accents .
Par exemple, le caractère "ö" Pourrait être exprimé par un "o" suivi de U+0308 COMBINING DIARESIS (Alias ​​tréma, point double au-dessus).
Nous devons considérer qu'une telle séquence de deux points de code occupe une colonne d'affichage à des fins d'alignement, et pour cela, git_wcwidth() devrait retourner 0 pour eux.

Les points de code concernés sont:

U+0358..U+035C
U+0487
U+05A2, U+05BA, U+05C5, U+05C7
U+0604, U+0616..U+061A, U+0659..U+065F

Les normes unicode antérieures les avaient définies comme "réservées".

Seule la plage 0..U+07FF A été vérifiée pour voir quels points de code doivent être marqués comme largeur 0 lors de la préparation de cette validation; d'autres mises à jour peuvent être nécessaires.


Mise à jour d'avril 2012: la prise en charge d'Unicode est disponible dans la version 1.7.10. Voir cette page pour les notes et les paramètres que vous devez définir.

À savoir:

git config [--global] core.quotepath off
git config [--global] i18n.logoutputencoding utf8
git config [--global] i18n.commitencoding utf8
git config [--global] --unset svn.pathnameencoding

La commande recodetree check analyse l'historique complet d'un référentiel git et imprime tous les noms de fichiers non ASCII. Si la sortie est vide, aucune migration n'est nécessaire.


Mise à jour de février 2012: les correctifs pour les supports UTF-8 arrivent dans la branche 'devel' de repo msysgit sur GitHub , y compris Mettre à jour les paramètres moins pour UTF-8 .

La page Google+ de Git pour Windows mentionne:

Les correctifs UTF-8 de Karsten Blees pour Git pour Windows ont maintenant été fusionnés en "devel".
Cela signifie que la prochaine version prendra en charge les noms de fichiers Unicode!


Mai 2011

Je crois que msysgit issue 8 a la dernière version de ce bogue.
Également décrit dans numéro 376 .

Par exemple:

Voici ce qui se passe:

  1. git sous Windows fonctionne sur les noms de fichiers et les traite essentiellement comme des flux d'octets. Dans votre cas, les flux se trouvent être du texte codé UTF8.

  2. git sous Windows demande au runtime de créer un fichier et lui transmet le flux d'octets.

  3. Comme en interne sur Windows, tout est Unicode, le runtime convertit le flux d'octets en UTF16 en utilisant les paramètres régionaux actuellement définis (aka "page de code").
    Autrement dit, il interprète efficacement le flux d'octets comme du texte codé CP949 (coréen).
    Apparemment, certaines des séquences d'octets UTF8 sont des séquences CP949 invalides, et la conversion échoue ("Argument invalide"); ou si les séquences UTF8 se trouvent être des séquences CP949 correctes, le résultat est (très probablement) un caractère différent.

La vraie solution devrait être sur MingW si:

Il me semble qu'une solution serait la suivante: la résoudre au niveau de la bibliothèque d'exécution GCC C.
Autrement dit, pour la bibliothèque d'exécution mingw GCC sous Windows, il est possible, via les options de génération, d'être dans un mode où les paramètres de ligne de commande (passés à main()) et Les fonctions d'E/S de fichier utilisent les appels d'API Windows Unicode sous-jacents et se traduisent vers/depuis le codage UTF-8 dans les API de fonction standard de C qui utilisent des chaînes d'octets.
Cela "fonctionnerait peut-être" pour git peut-être, et pourrait être utile pour d'autres projets open source Linux exécutant l'environnement Windows.

ak2 commente que MingW n'est pas le bon endroit pour ce correctif:

"Les compilateurs MinGW permettent d'accéder aux fonctionnalités du runtime Microsoft C et de certains runtimes spécifiques à la langue.
MinGW, étant minimaliste, ne tente pas et ne tentera jamais de fournir un environnement d'exécution POSIX pour le déploiement d'applications POSIX sur MS-Windows.
Si vous souhaitez déployer une application POSIX sur cette plate-forme, veuillez plutôt envisager Cygwin. "

Il y a du travail en cours sur une variante msysgit pour supporter unicode .

40
VonC