Git et le problème d’Umlaut sous Mac OS X

Aujourd’hui, j’ai découvert un bug pour Git sur Mac OS X.

Par exemple, je vais valider un fichier avec le nom überschrift.txt avec le caractère spécial allemand Ü au début. A partir de la commande git status j’obtiens la sortie suivante.

 Users-iMac: user$ git status On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # "U\314\210berschrift.txt" nothing added to commit but untracked files present (use "git add" to track) 

Il semble que Git 1.7.2 ait un problème avec les caractères spéciaux allemands sur Mac OS X. Existe-t-il une solution pour que Git lise correctement les noms de fichiers?

Activer core.precomposeunicode sur le mac

 git config --global core.precomposeunicode true 

Pour que cela fonctionne, vous devez avoir au moins Git 1.8.2.

Mountain Lion est livré avec 1.7.5. Pour obtenir un nouveau git, utilisez git-osx-installer ou homebrew (nécessite Xcode).

C’est tout.

La cause est l’implémentation différente de la façon dont le système de fichiers stocke le nom du fichier.

En Unicode, Ü peut être représenté de deux manières, l’une étant par Ü seul, l’autre par U + “combinant le caractère tréma”. Une chaîne Unicode peut contenir les deux formes, mais comme il est déroutant d’avoir les deux, le système de fichiers normalise la chaîne unicode en définissant chaque Umlauted-U sur Ü ou U + “combinant le caractère tréma”.

Linux utilise l’ancienne méthode, appelée Normal-Form-Composed (ou NFC), et Mac OS X utilise cette dernière méthode, appelée Normal-Form-Decomposed (NFD).

Apparemment, Git ne se soucie pas de ce point et utilise simplement la séquence d’octets du nom de fichier, ce qui conduit au problème que vous rencontrez.

Le fil de liste de diffusion Git, Mac OS X et les caractères spéciaux allemands contiennent un patch pour que Git compare les noms de fichiers après la normalisation.

La mise suivante dans ~ / .gitconfig fonctionne pour moi sur 10.12.1 Sierra pour les noms UTF-8:

 precomposeunicode = true quotepath = false 

La première option est nécessaire pour que git ‘comprenne’ UTF-8 et le second de manière à ne pas échapper aux caractères.

Pour que git add file fonctionne avec des trémas dans les noms de fichiers sous Mac OS X, vous pouvez convertir des chaînes de chemin de fichiers composées en fichiers UTF-8 décomposés de manière canonique en utilisant iconv .

 # test case mkdir testproject cd testproject git --version # git version 1.7.6.1 locale charmap # UTF-8 git init file=$'\303\234berschrift.txt' # composed UTF-8 (Linux-compatible) touch "$file" echo 'Hello, world!' > "$file" # convert composed into canonically decomposed UTF-8 # cf. http://codesnippets.joyent.com/posts/show/12251 # printf '%s' "$file" | iconv -f utf-8 -t utf-8-mac | LC_ALL=C vis -fotc #git add "$file" git add "$(printf '%s' "$file" | iconv -f utf-8 -t utf-8-mac)" git commit -a -m 'This is my commit message!' git show git status git ls-files '*' git ls-files -z '*' | tr '\0' '\n' touch $'caf\303\251 1' $'caf\303\251 2' $'caf\303\251 3' git ls-files --other '*' git ls-files -z --other '*' | tr '\0' '\n' 

Remplacez l’indicateur core.precomposeunicode spécifique au core.precomposeunicode OSX du référentiel par true:

 git config core.precomposeunicode.true 

Pour vous assurer que les nouveaux référentiels obtiennent cet indicateur, exécutez également:

 git config --global core.precomposeunicode true 

Voici l’extrait pertinent de la page de manuel:

Cette option est uniquement utilisée par l’implémentation Mac de Git. Lorsque core.precomposeunicode = true, Git rétablit la décomposition unicode des noms de fichiers effectuée par Mac OS. Ceci est utile lorsque vous partagez un référentiel entre Mac OS et Linux ou Windows. (Git pour Windows 1.7.10 ou supérieur est nécessaire, ou Git sous cygwin 1.7). Lorsque la valeur est fausse, les noms de fichiers sont traités en toute transparence par Git, qui est rétrocompatible avec les anciennes versions de Git.

C’est correct.

Votre nom de fichier est en UTF-8 , Ü étant représenté en tant que lettre de correspondance LATIN CAPITAL LETTER U + (Unicode 0x0308, utf8 0xcc 0x88) au lieu de LETTRE MAJUSCULE LATINE U AVEC DIAERESIS (Unicode 0x00dc, utf8 0xc3 0x9c). Le système de fichiers HFS Mac OS X décompose Unicode de cette manière . Git affiche à son tour la forme d’échappement octal des octets de nom de fichier non-ASCII.

Notez que les noms de fichiers Unicode peuvent rendre votre référentiel non portable. Par exemple, msysgit a rencontré des problèmes avec les noms de fichiers Unicode .

J’ai eu un problème similaire avec mon repository personnel, alors j’ai écrit un script d’aide avec Python 3. Vous pouvez le graver ici: https://github.com/sjtoik/umlaut-cleaner

Le script a besoin d’un peu de travail manuel, mais pas beaucoup.