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 ответов:
включить ядра.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
сценарий требует немного ручного труда, но не намного.