Git и проблема умлаута в Mac OS X - PullRequest
68 голосов
/ 07 апреля 2011

Сегодня я обнаружил ошибку для 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)
#
#   "U\314\210berschrift.txt"
nothing added to commit but untracked files present (use "git add" to track)

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

Ответы [ 7 ]

87 голосов
/ 21 марта 2013

Включить core.precomposeunicode на компьютере Mac

git config --global core.precomposeunicode true

Чтобы это работало, вам нужно иметь как минимум Git 1.8.2.

Корабли Mountain Lion с 1.7.5.Чтобы получить более новый git, используйте git-osx-installer или homebrew (требуется Xcode).

Вот и все.

31 голосов
/ 07 апреля 2011

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

В Юникоде, Ü может быть представлено двумя способами, один - одним Ü, другой - 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 сравнивать имена файлов после нормализации.

7 голосов
/ 20 декабря 2016

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

precomposeunicode = true
quotepath = false

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

5 голосов
/ 06 сентября 2011

Чтобы заставить git add file работать с умлаутами в именах файлов в 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=$'\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'
3 голосов
/ 02 декабря 2013

Измените для репозитория OSX-флаг core.precomposeunicode на true:

git config core.precomposeunicode.true

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

git config --global core.precomposeunicode true

Вот соответствующийфрагмент справочной страницы:

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

1 голос
/ 07 апреля 2011

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

Ваше имя файла находится в UTF-8 , Ü представлен как LATIN CAPITAL LETTER U + ДИАРЕЗ КОМБИНИРОВАНИЯ (Unicode 0x0308, utf8 0xcc 0x88) вместо LATIN CAPITALПИСЬМО U С ДИАРЕЗОМ (Unicode 0x00dc, utf8 0xc3 0x9c).Файловая система Mac OS X HFS выполняет декомпозицию Unicode таким образом . Git , в свою очередь, отображает восьмеричную форму байтов имени файла, отличного от ASCII.

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

0 голосов
/ 22 апреля 2014

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

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

...