2010-10-12 26 views

Répondre

4

Je travaille sur une solution beaucoup mieux avec l'aide du peuple msysGit, et je suis venu avec ce filtre propre/bavure. Le filtre utilise les commandes Gnu et iconv pour déterminer le type du fichier et le convertir vers et depuis le format UTF-8 interne de msysGit.

Ce type de filtre Clean/Smudge vous donne beaucoup plus de flexibilité. Cela devrait permettre à Git de traiter vos fichiers au format mixte comme du texte UTF-8 dans la plupart des cas: diffs, merge, git-grep, ainsi que des propriétés gitattributes comme eol-conversion, ident-replacement et les patterns de diff intégrés.

La solution de filtre diff décrite ci-dessus ne fonctionne que pour les diffs, et est donc beaucoup plus limitée.

Pour configurer ce filtre:

  1. Get Gnu libiconv et file, et installer les deux.
  2. Assurez-vous que le répertoire bin GnuWin32 \ (généralement "C: \ Program Files \ GnuWin32 \ bin") est dans votre% PATH%
  3. Ajouter ce qui suit à ~ \ Git \ etc \ gitconfig:

    [filter "mixedtext"] 
        clean = iconv -sc -f $(file -b --mime-encoding %f) -t utf-8 
        smudge = iconv -sc -f utf-8 -t $(file -b --mime-encoding %f) 
        required 
    
  4. Ajoutez une ligne à votre global ~/Git/etc/gitattributes ou local ~ /.gitattributes pour traiter le texte en format mixte, par exemple:

    *.txt filter=mixedtext 
    

Je l'ai utilisé cela sur un répertoire avec des fichiers SQL dans la norme ANSI, UTF-16 et UTF-8 formats. Cela fonctionne jusqu'à présent. Sauf surprise, cela ressemble à l'effort de 20% qui pourrait couvrir 80% de tous les problèmes de formatage de Windows.

+0

pouvez-vous confirmer si cette solution s'applique rétrospectivement pour les commits précédents? J'ai essayé ceci et mes modifications aux fichiers UTF-16 ne s'affichent toujours pas dans l'outil 'gitk' de msysgit. – Adam

+0

cela semble échouer quand je fais une «traction git» qui comprend les fichiers supprimés par un autre utilisateur git. Je reçois l'erreur msg de iconv: 'conversion en can not unsupported' ... y a-t-il un moyen d'empêcher l'exécution de ce filtre sur les fichiers supprimés? – Adam

+0

J'utilise cette solution depuis longtemps et cela fonctionne parfaitement pour msysgit jusqu'à 1.9.5 sur Windows. Dans le dernier Git 2.x, il n'y a plus de fichier '.gitattributes'. Avez-vous une solution qui fonctionne également dans la dernière version de Git? – Adam

2

Cette méthode est pour MSysGit 1.8.1 et est testée sous Windows XP. J'utilise Git Extensions 2.44, mais comme les changements sont au niveau Git, ils devraient aussi fonctionner pour Git Gui. Étapes:

  1. Installez Gnu Iconv.

  2. Créer le script suivant, nommez-astextutf16, et le placer dans le répertoire/bin de votre installation de Git (ceci est basé sur le script astextplain existant):

    #!/bin/sh -e 
    # converts Windows Unicode (UTF-16/UCS-2) to Git-friendly UTF-8 
    # notes: 
    # * requires Gnu iconv: 
    #  http://gnuwin32.sourceforge.net/packages/libiconv.htm 
    # * this script must be placed in: ~/Git/bin 
    # * modify global ~/Git/etc/gitconfig or local ~/.git/config: 
    #  [diff "astextutf16"] 
    #   textconv = astextutf16 
    # * or, from command line: 
    #  $ git config diff.astextutf16.textconv astextutf16 
    # * modify global ~/Git/etc/gitattributes or local ~/.gitattributes: 
    #  *.txt diff=astextutf16 
    if test "$#" != 1 ; then 
        echo "Usage: astextutf16 <file>" 1>&2 
        exit 1 
    fi 
    # -f(rom) utf-16 -t(o) utf-8 
    "\Program Files\GnuWin32\bin\iconv.exe" -f utf-16 -t utf-8 "$1" 
    exit 0 
    
  3. Modifier le global ~/Git/etc/gitconfig ou votre fichier local ~/.git/config, et ajoutez ces lignes:

    [diff "astextutf16"] 
        textconv = astextutf16 
    
  4. ou, de la ligne de commande:

    $ git config diff.astextutf16.textconv astextutf16

  5. Modifier les mondiaux ~/Git/etc/gitattributes ou votre fichier local ~/de .gitattributes, et mapper vos extensions à convertir:

    *.txt diff=astextutf16

  6. Test. Les fichiers UTF-16 devraient maintenant être visibles.

2

J'ai rencontré un problème similaire.

Je voudrais améliorer la réponse acceptée, car elle a un petit défaut. Le problème que je suis tombé sur était que si le fichier n'existait pas, j'ai reçu cette erreur:

conversion to cannot unsupported 

J'ai changé les commandes de sorte qu'un fichier ne soit pas nécessaire. Il utilise seulement stdin/stdout. Cela a corrigé le problème. Mon fichier .git/config ressemble maintenant à ceci:

[filter "mixedtext"] 
    clean = "GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP" 
    smudge = "GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP" 
    required = true 

Pour créer les entrées dans votre .git/config utiliser ces commandes:

git config --replace-all filter.mixedtext.clean 'GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f $TYPE -t utf-8; rm -f $GITTMP' 
git config --replace-all filter.mixedtext.smudge 'GITTMP=$(mktemp);TYPE=$(tee $GITTMP|file -b --mime-encoding -); cat $GITTMP | iconv -sc -f utf-8 -t $TYPE; rm -f $GITTMP' 
git config --replace-all filter.mixedtext.required true 

Mon fichier .gitattributes ressemble à ceci:

*.txt filter=mixedtext 
*.ps1 filter=mixedtext 
*.sql filter=mixedtext 

Spécifiez uniquement les fichiers pouvant poser un problème, sinon le nettoyage/nettoyage doit effectuer plus de travail (fichiers temporaires).

Nous avons également converti en vrac les fichiers UTF-16le en git en UTF-8 car il s'agit de l'encodage le plus compact et portable pour UTF. La même commande iconv utilisée dans clean et smudge était parfaite pour convertir en permanence les fichiers. La bonne chose à propos des commandes clean/smudge est que même si un fichier est enregistré avec, disons, UTF-16le, le diff fonctionnera toujours.