мерзавец, msysgit, акценты, utf-8, окончательные ответы - PullRequest
45 голосов
/ 02 мая 2011

В некоторых местах я читал, что есть проблемы с git (или просто с msysgit?) И кодировкой символов - я считаю это только проблема с именами файлов.

Мне нужна некоторая «окончательная» (или хотя бы авторитетная) информация о:

  1. Какие именно «проблемы»? (Симптомы)
  2. Каковы причины? (Кратко) * +1010 *
  3. В каких случаях это шоу-стоппер?
  4. Есть ли какое-либо разрешение в поле зрения или неудачные обходные пути?

Надеюсь, этот вопрос не слишком расплывчатый, я думаю, было бы хорошо, чтобы вся эта информация была в одном месте, чтобы можно было указать на нее людям ...

1 Ответ

40 голосов
/ 02 мая 2011

Обновление февраль 2017 г. (Git 2.12): таблица ширины символов обновлена ​​для соответствия Юникод 9.0 .
update_unicode.sh означает , переместив его в contrib/update-unicode: см. README .

Обновление от августа 2014 г. (git 2.1): commit a67c821 ( Torsten Bögershausen (tboegi) ) добавляет поддержку Unicode 7.0.

Обновление апрель 2014: commit d813ab9 ( Torsten Bögershausen (tboegi) ) добавляет поддержку Unicode 6.3
(git 1.9.2):

Unicode 6.3 определяет больше кодовых точек как комбинацию или акценты .
Например, символ "ö" может быть выражен как "o", за которым следует U+0308 COMBINING DIARESIS (он же умлаут, двойная точка сверху).
Мы должны учитывать, что такая последовательность из двух кодовых точек занимает один столбец отображения для целей выравнивания, и для этого git_wcwidth() должен возвращать 0 для них.

Затронутые кодовые точки:

U+0358..U+035C
U+0487
U+05A2, U+05BA, U+05C5, U+05C7
U+0604, U+0616..U+061A, U+0659..U+065F

Ранее стандарты Unicode определяли их как "зарезервированные".

Только диапазон 0..U+07FF был проверен, чтобы увидеть, какие кодовые точки должны быть помечены как 0-width при подготовке к этой фиксации; может потребоваться больше обновлений.


Обновление апрель 2012: поддержка Unicode выпущена в версии 1.7.10. См. на этой странице для заметок и настроек, которые следует установить.

А именно:

git config [--global] core.quotepath off
git config [--global] i18n.logoutputencoding utf8
git config [--global] i18n.commitencoding utf8
git config [--global] --unset svn.pathnameencoding

Команда recodetree check сканирует всю историю репозитория git и печатает все имена файлов, не относящиеся к ASCII. Если выходные данные пусты, миграция не требуется.


Обновление февраль 2012: исправления для поддержки UTF-8 поступают в ветку 'devel' msysgit repo на GitHub , включая Обновление без настроек для UTF-8 .

На странице Git для Windows Google+ упоминается:

Karsten Blees 'Патчи UTF-8 для Git для Windows теперь объединены в' devel '.
Это означает, что следующий выпуск будет поддерживать имена файлов Unicode!


май 2011

Я полагаю, что проблема msysgit 80 содержит последнюю версию этой ошибки.
Также описано в выпуске 376 .

Например:

Вот что происходит:

  1. git в Windows работает с именами файлов и обрабатывает их по существу как байтовые потоки. В вашем случае потоки представляют собой текст в кодировке UTF8.

  2. git в Windows просит среду выполнения создать файл и передает ему поток байтов.

  3. Поскольку внутренне в Windows все Unicode, среда выполнения преобразует байт поток в UTF16, используя текущую локаль (кодовая страница).
    То есть он эффективно интерпретирует поток байтов как текст в кодировке CP949 (корейский).
    По-видимому, некоторые из байтовых последовательностей UTF8 являются недопустимыми последовательностями CP949, и преобразование завершается неудачно («Неверный аргумент»); или если последовательности UTF8 оказываются правильными последовательностями CP949, результатом является (скорее всего) другой символ.

Истинное исправление должно быть на MingW, хотя :

Мне приходит в голову, что одно решение будет таким: решить его во время выполнения GCC C уровень библиотеки.
То есть, для библиотеки времени выполнения mingw GCC в Windows с помощью параметров времени сборки можно находиться в режиме, в котором параметры командной строки (переданные в main()) и функции файлового ввода-вывода используют базовую Windows Вызовы API Unicode и перевод в / из кодировки UTF-8 в стандартных API функций C, которые используют строки байтов.
Это, возможно, "просто работает" для git и может быть полезно для других проектов Linux с открытым исходным кодом, работающих под управлением среды Windows.

ak2 комментирует, что MingW не подходящее место для этого исправления:

"Компиляторы MinGW обеспечивают доступ к функциональности среды выполнения Microsoft C и некоторым языковым средам исполнения.
MinGW, будучи минималистом, не пытается и никогда не попытается предоставить среду выполнения POSIX для развертывания приложений POSIX в MS-Windows.
Если вы хотите развертывать приложения POSIX на этой платформе, рассмотрите Cygwin. "

В версии msysgit для поддержки Unicode .

идет работа.
...