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. Depuis la commande git status
J'obtiens la sortie suivante.
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 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 git plus récent, utilisez git-osx-installer ou homebrew (nécessite Xcode).
C'est tout.
La cause en est l'implémentation différente de la façon dont le système de fichiers stocke le nom de fichier.
En Unicode, Ü peut être représenté de deux manières, l'une par Ü seule, l'autre par U + "combinaison de caractères de 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 + "combinaison de caractères de tréma".
Linux utilise l'ancienne méthode, appelée Normal-Form-Composed (ou NFC), et Mac OS X utilise la 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 la liste de diffusion Git, Mac OS X et caractères spéciaux allemands contient un patch afin que Git compare les noms de fichiers après 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 la seconde pour qu'il n'échappe pas aux caractères.
Faire git add file
travailler avec des trémas dans les noms de fichiers sur Mac OS X, vous pouvez convertir des chaînes de chemin de fichier 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'
Modifiez l'OSX spécifique du référentiel core.precomposeunicode
drapeau à vrai:
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 n'est utilisée que par l'implémentation Mac OS de Git. Lorsque core.precomposeunicode = true, Git annule la décomposition unicode des noms de fichiers effectuée par Mac OS. Ceci est utile lors du partage d'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). Lorsqu'ils sont faux, les noms de fichiers sont gérés de manière totalement transparente par Git, qui est rétrocompatible avec les anciennes versions de Git.
C'est correct.
Votre nom de fichier est en TF-8 , Ü étant représenté par une lettre majuscule latine U + DIAERESIS COMBINÉ (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 de Mac OS X décompose Unicode de cette manière . Git montre à son tour la forme d'échappement octale 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 eu des problèmes avec les noms de fichiers Unicode .
J'ai eu un problème similaire avec mon référentiel personnel, j'ai donc écrit un script d'aide avec Python 3. Vous pouvez le saisir ici: https://github.com/sjtoik/umlaut- nettoyant
Le script a besoin d'un peu de travail manuel, mais pas beaucoup.