Git испортил мои файлы, показывая китайских персонажей в некоторых местах
отказ от ответственности: через Git я имею в виду "я" испорчен.
Ранее, я хотел git-gui
показать мне diff
, для которого он считает двоичные файлы.
Итак, я внес некоторые изменения в мой .\.gitattributes
*.ini text
*.inc text
Но это не сработало. Затем я внес некоторые изменения в my .\.git\info\attributes
*.ini text
*.inc text
*.inc crlf diff
*.ini crlf diff
и это сработало.
Но теперь, когда я возвращаюсь к предыдущим коммитам, это беспорядок...
Вот как это должно выглядеть:
![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". Китайские персонажи снова стали оригинальными персонажами.