tutorial - Problema de Git y Umlaut en Mac OS X
git tag name (7)
Cambie el indicador core.precomposeunicode
específico del OSX del repositorio a verdadero:
git config core.precomposeunicode.true
Para asegurarse de que los nuevos repositorios obtengan esa marca, también ejecute:
git config --global core.precomposeunicode true
Aquí está el fragmento relevante de la página de manual:
Esta opción solo la usa la implementación Mac OS de Git. Cuando core.precomposeunicode = true, Git revierte la descomposición unicode de los nombres de archivo hechos por Mac OS. Esto es útil cuando se comparte un repositorio entre Mac OS y Linux o Windows. (Se necesita Git para Windows 1.7.10 o superior, o Git bajo cygwin 1.7). Cuando es falso, los nombres de los archivos se manejan completamente transparentes por Git, que es compatible con versiones anteriores de Git.
Hoy descubrí un error para Git en Mac OS X.
Por ejemplo, al principio voy a enviar un archivo con el nombre überschrift.txt con el carácter especial alemán Ü. Desde el git status
comando git status
obtengo el siguiente resultado.
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)
Parece que Git 1.7.2 tiene un problema con los caracteres especiales alemanes en Mac OS X. ¿Hay alguna solución para que Git lea correctamente los nombres de los archivos?
Es correcto.
Su nombre de archivo está en UTF-8 , Ü está representado como LETRA MAYÚSCULA LATINA U + DIAGRÉS COMBINADO (Unicode 0x0308, utf8 0xcc 0x88) en lugar de la LETRA MAYÚSCULA LATINA U CON DIAESIS (Unicode 0x00dc, utf8 0xc3 0x9c). El sistema de archivos Mac OS X HFS descompone Unicode de esa manera . Git a su vez muestra la forma de escape octal de los bytes de nombre de archivo no ASCII.
Tenga en cuenta que los nombres de archivo Unicode pueden hacer que su repositorio no sea portátil. Por ejemplo, msysgit ha tenido problemas con los nombres de archivo Unicode .
Habilitar core.precomposeunicode en el mac
git config --global core.precomposeunicode true
Para que esto funcione, debes tener al menos Git 1.8.2.
Mountain Lion se envía con 1.7.5. Para obtener un git más nuevo, use git-osx-installer o homebrew (requiere Xcode).
Eso es.
La causa es la diferente implementación de cómo el sistema de archivos almacena el nombre del archivo.
En Unicode, Ü se puede representar de dos maneras, una es por Ü solo, la otra es por U + "que combina umlaut character". Una cadena Unicode puede contener ambas formas, pero como es confuso tener ambas, el sistema de archivos normaliza la cadena Unicode configurando cada Uumlauted-U en Ü, o U + "combinando umlaut character".
Linux usa el método anterior, llamado Normal-Form-Composed (o NFC), y Mac OS X utiliza el último método, llamado Normal-Form-Decomposed (NFD).
Aparentemente, a Git no le importa este punto y simplemente usa la secuencia de bytes del nombre de archivo, lo que lleva al problema que estás teniendo.
El hilo de la lista de distribución Git, Mac OS X y los caracteres especiales alemanes tienen un parche para que Git compare los nombres de los archivos después de la normalización.
Lo siguiente en ~ / .gitconfig me funciona en 10.12.1 Sierra para nombres UTF-8:
precomposeunicode = true
quotepath = false
La primera opción es necesaria para que git ''entienda'' UTF-8 y la segunda para que no escape a los caracteres.
Para que git add file
funcione con diéresis en los nombres de archivo en Mac OS X, puede convertir las cadenas de ruta de archivo de compuestas a UTF-8 canónicamente descompuestas usando 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''
Tuve un problema similar con mi repositorio personal, así que escribí un guión de ayuda con Python 3. Puede escribirlo aquí: https://github.com/sjtoik/umlaut-cleaner
El script necesita un poco de trabajo manual, pero no mucho.