Git и проблема Umlaut на Mac OS X


сегодня я обнаружил ошибку для Git на Mac OS X.

например, я зафиксирую файл с именем überschrift.txt с немецким специальным символом Ü в начале. От команды git status Я получаю следующий вывод.

Users-iMac: user$ git status

On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   "U40berschrift.txt"
nothing added to commit but untracked files present (use "git add" to track)

похоже, что Git 1.7.2 имеет проблему с немецкими специальными символами на Mac OS X. Есть ли решение, чтобы получить Git правильно прочитать имена файлов?

7 62

7 ответов:

включить ядра.precomposeunicode на mac

git config --global core.precomposeunicode true

для этого, чтобы работать, вы должны иметь по крайней мере Git 1.8.2.

Mountain Lion корабли с 1.7.5. Чтобы получить новый git либо использовать git-osx-installer или доморощенного (требуется Xcode).

вот и все.

причиной является другая реализация того, как файловая система хранит имя файла.

в Unicode, Ü может быть представлен двумя способами, один из которых является Ü в одиночку, другой-U + "объединение умлаут символ". Строка Unicode может содержать обе формы, но поскольку это сбивает с толку, файловая система нормализует строку unicode, устанавливая каждый umlauted-U в Ü или U + "комбинируя символ umlaut".

Linux использует первый метод, называемый Normal-Form-Composed (или NFC), и Mac OS X использует последний метод, называемый Normal-Form-Decomposed (NFD).

видимо Git не заботится об этом пункте и просто использует последовательность байтов имени файла, что приводит к проблеме, с которой вы столкнулись.

поток списка рассылки Git, Mac OS X и немецкие специальные символы есть патч в нем так, что Git сравнивает имена файлов после нормализации.

следующий положить в ~/.gitconfig работает для меня на 10.12.1 Sierra для имен UTF-8:

precomposeunicode = true
quotepath = false

первый вариант необходим, чтобы git "понимал" UTF-8, а второй-чтобы он не избегал символов.

сделать git add file работа с umlauts в именах файлов на Mac OS X, вы можете конвертировать строки пути к файлу из составного в канонически разложенный UTF-8 с помощью iconv.

# test case

mkdir testproject
cd testproject

git --version    # git version 1.7.6.1
locale charmap   # UTF-8

git init
file=$'34berschrift.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 '' '\n'

touch $'caf31 1' $'caf31 2' $'caf31 3'
git ls-files --other '*'
git ls-files -z --other '*' | tr '' '\n'

изменить OSX-специфичный репозиторий core.precomposeunicode флаг в true:

git config core.precomposeunicode.true

чтобы убедиться, что новые репозитории получают этот флаг, также запустите:

git config --global core.precomposeunicode true

вот соответствующий фрагмент из manpage:

эта опция используется только в Mac OS реализации Git. Когда ядро.precomposeunicode=true, Git возвращает декомпозицию Юникода имена файлов, созданные Mac OS. Это полезно при совместном использовании репозитория между Mac OS и Linux или Windows. (Git для Windows 1.7.10 или выше необходим, или Git под cygwin 1.7). Если значение false, имена файлов обрабатывается полностью прозрачным Git, который обратно совместим с старые версии Git.

Это правильно.

ваше имя в UTF-8, Ü представлены в виде латинской буквы U в + диерезиса (0x0308 Юникод, utf8 в 0xcc 0x88) вместо латинской буквы U с ТРЕМОЙ (0x00dc Юникод, utf8 в 0xc3 0x9c). Элемент файловая система Mac OS X HFS разлагает Unicode таким образом. Git в свою очередь показывает восьмеричную форму экранирования байтов имени файла без ASCII.

обратите внимание, что имена файлов Unicode могут сделать ваш репозиторий непереносимый. Например, у msysgit были проблемы с именами файлов Unicode.

У меня была аналогичная проблема с моим личным репозиторием, поэтому я написал вспомогательный скрипт с Python 3. Вы можете захватить его здесь:https://github.com/sjtoik/umlaut-cleaner

сценарий требует немного ручного труда, но не намного.