Git испортил мои файлы, показывая китайских персонажей в некоторых местах

отказ от ответственности: через Git я имею в виду "я" испорчен.

Ранее, я хотел git-gui показать мне diff, для которого он считает двоичные файлы.

Итак, я внес некоторые изменения в мой .\.gitattributes

*.ini       text
*.inc       text

Но это не сработало. Затем я внес некоторые изменения в my .\.git\info\attributes

*.ini       text
*.inc       text
*.inc crlf diff
*.ini crlf diff

и это сработало.

Но теперь, когда я возвращаюсь к предыдущим коммитам, это беспорядок...

chinese characters Вот как это должно выглядеть: english characters

Это не происходит во всех файлах. EDIT: Это происходит только в файлах, в которых есть специальные символы.

Q: Это проблема с самими коммитами или просто с настройкой?
В: Могу ли я восстановиться?

Ответы

Ответ 1

Ваши ini файлы сохраняются в UTF-16LE, кодировке, которую Windows вводит в заблуждение как "Unicode".

Git стандартные инструменты не работают на UTF-16, потому что это не ASCII-совместимая кодировка. Вот почему git первоначально обнаружил файлы как двоичные.

Преобразование новой строки LF/CRLF видит каждый байт 0x0A как новую строку и заменяет его 0x0D-0x0A. Но в файле UTF-16LE новая строка фактически сигнализируется 0x0A-0x00, и замена этого на 0x0D-0x0A-0x00 означает, что у вас есть нечетное количество байтов, поэтому выравнивание каждого двухбайтового кодового блока в следующей строке не синхронизируется. Следовательно, каждая другая линия искажается.

Ваши варианты:

  • Отмените изменение атрибута и пусть git обрабатывает файлы как двоичные (теряя выгоду от различий).

  • Сохраните файлы в кодировке, совместимой с ASCII. Похоже, у вашего контента фактически нет каких-либо символов, отличных от ASCII, так что, надеюсь, это не проблема? Обычно вы хотите сохранить все свои файлы как UTF-8 - это ASCII-совместимый, но также позволяет использовать все символы Unicode. Но это зависит от того, поддерживает ли Rainmeter чтение файлов INI, закодированных таким образом (вероятно, нет).

  • Настройте git на использование другого инструмента сравнения, хотя это затруднит работу других с вашим репо.

Ответ 2

Недавно у меня была аналогичная проблема. У нас есть файл проекта .gitattributes на уровне корня, который включает в себя следующие строки: -

* text=auto
*.sql     text

Одна из наших сотрудников написала SQL-код с помощью SQL Management Studio, который, как ему неизвестно, сохранял файлы как UTF-16. Он смог проверить код до Git без проблем, но при проверке код был переведен на китайские символы, как описано в этом сообщении.

В hexdump файлов, о которых идет речь, подтверждается, что проблема действительно была переводом 0x000A в 0x000A0D.

Для нас решением было преобразовать файлы в ASCII, используя следующее: -

  • Удалить нарушительный файл из рабочего каталога
  • Создайте временный файл .gitattributes в локальном каталоге, чтобы принудительно выполнить Git, чтобы проверить файл без выполнения преобразования конца строки. например включить строку *.sql binary

  • Откажитесь от файла (ов) из Git. Вы должны увидеть, что файлы не были переведены и не имеют китайских символов.

  • Преобразовать файл в ASCII. Для этого мы использовали Notepad ++, но также можно использовать iconv, который установлен как часть Git Для Windows. Я думаю, что UTF-8 также будет вариантом, если файл содержит символы, отличные от ASCII, но это не было необходимо для наших целей.
  • Регистрация версии ASCII файла
  • Удалить локальный .gitattributes файл

Ответ 3

Чтобы добавить к хорошим объяснениям @bobince. Одним из решений этой проблемы (кроме файлов со специальными символами) является преобразование всего в utf-8. Я решил это, запустив python script в блокноте ++ для всех файлов в каталоге (с компьютера, на котором не было файлов, испорченных).

Я нашел исходный script здесь

Копия блокнота ++ python script:

import os;
import sys;
filePathSrc="C:\\Temp\\UTF8"
for root, dirs, files in os.walk(filePathSrc):
    for fn in files:
      if fn[-4:] != '.jar' and fn[-5:] != '.ear' and fn[-4:] != '.gif' and fn[-4:] != '.jpg' and fn[-5:] != '.jpeg' and fn[-4:] != '.xls' and fn[-4:] != '.GIF' and fn[-4:] != '.JPG' and fn[-5:] != '.JPEG' and fn[-4:] != '.XLS' and fn[-4:] != '.PNG' and fn[-4:] != '.png' and fn[-4:] != '.cab' and fn[-4:] != '.CAB' and fn[-4:] != '.ico':
        notepad.open(root + "\\" + fn)
        console.write(root + "\\" + fn + "\r\n")
        notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM")
        notepad.save()
        notepad.close()

Ответ 4

В моем случае я решил это с помощью Notepad ++ и изменил кодировку файла с "UTF-8" на "Спецификация UTF-8". Китайские персонажи снова стали оригинальными персонажами.