74 votes

Git et le problème du Umlaut sous Mac OS X

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

Par exemple, je vais livrer un fichier dont le nom est überschrift.txt avec le caractère spécial allemand Ü au début. A partir de la commande git status J'obtiens le résultat suivant.

Users-iMac: user$ git status

On branch master
# Untracked files:
#   (use "git add <file>..." 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 sous Mac OS X. Existe-t-il une solution pour que Git lise correctement les noms de fichiers ?

89voto

Leo Koppelkamm Points 672

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 la version 1.7.5. Pour obtenir un git plus récent, utilisez git-osx-installer o homebrew (nécessite Xcode).

C'est tout.

36voto

Yuji Points 26887

La cause en est l'implémentation différente de la manière dont le système de fichiers stocke le nom du fichier.

Dans Unicode, Ü peut être représenté de deux manières, l'une étant Ü seul, l'autre étant U + "caractère de tréma combiné". 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 donnant à chaque umlauted-U la valeur Ü, ou U + "caractère de tréma combiné".

Linux utilise la première méthode, appelée Normal-Form-Composed (ou NFC), et Mac OS X utilise la seconde 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 la liste de diffusion Git, Mac OS X et caractères spéciaux allemands contient un patch pour que Git compare les noms de fichiers après normalisation.

5voto

pete Points 41

Pour faire git add file pour travailler avec les trémas dans les noms de fichiers sous Mac OS X, vous pouvez convertir les chaînes de chemin d'accès de composées en UTF-8 décomposé canoniquement 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'

3voto

Michał Hernas Points 68

Je ne peux pas commenter donc je vais l'écrire comme une réponse. La réponse de @Leo est correcte, sauf que vous n'avez pas besoin de re-cloner le repo. Vous pouvez simplement supprimer la branche et la revérifier.

3voto

user1338062 Points 1553

Modifiez les paramètres spécifiques à OSX du référentiel core.precomposeunicode à true :

git config core.precomposeunicode.true

Pour s'assurer que les nouveaux dépôts obtiennent ce drapeau, 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 OS de Git. Lorsque core.precomposeunicode=true, Git revient sur la décomposition unicode de des noms de fichiers effectuée par Mac OS. Ceci est utile lors du partage d'un dépôt 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 false, les noms de fichiers sont sont traités de manière totalement transparente par Git, ce qui est rétrocompatible avec les les anciennes versions de Git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X