Снимок экрана искаженного файла показывает, что каждая вторая строка представлена в виде последовательности китайских и других символов.Сравнение со скриншотом ожидаемого содержимого файла показывает, что в результирующем файле нет неожиданных символов вставлен ;скорее, последовательности нечетных символов представлены вместо соответствующих строк из исходного файла.
Если мы допустим, что файл закодирован в UTF-16, как гласит заголовок XML, тоесть правдоподобное объяснение: вы используете Windows, и действительное значение core.autocrlf
вашего клиента *1008* - true
, по крайней мере, для этого файла.Получающиеся автоматические преобразования завершения строки не сделают правильную вещь, потому что они не знают UTF-16.Автоматическое преобразование завершения строки должно быть отключено , по крайней мере, для затронутого файла.
Когда активна автоматическая трансляция crlf и клиент видит терминатор строки UTF-16 в файле, который он клонируетбудь то часть (логической) последовательности CR / LF или голая LF, часть LF будет закодирована как 00 0A
.Он принимает это как чистый LF, потому что его ожидаемый однобайтовый кодированный CR / LF будет 0D 0A
.В результате клиент преобразует такие последовательности в 00 0D 0A
, три байта вместо двух.Это выбрасывает всю следующую строку на один байт из регистра, но когда то же самое происходит в конце следующей строки, она возвращает следующую строку в регистр.Таким образом, при просмотре в редакторе, который понимает UTF-16, вы увидите чередующиеся строки правильного и неправильного текста, точно так же, как на скриншоте.
Лучший способ приблизиться к этому, вероятно, сделать целевой файл непригоднымдля полного завершения строки, гарантируя, что git видит его как двоичный файл, а не как текст (что это и есть для целей git).Вы не можете сделать это до клонирования хранилища, но вы сможете восстановить его после.Сделайте это:
- Клонируйте репозиторий.
Отредактируйте или создайте файл .gitattributes
в том же каталоге, что и проблемный XML-файл, поместив строку, которая отменяет XML-файлыатрибут 'text' в конце:
name-of-file.xml -text
Принудительно выполнить повторную синхронизацию целевого файла из исходного хранилища:
git rm --cached name-of-file.xml
git checkout HEAD -- name-of-file.xml
Возможно, стоит поискать и удалить любое назначение там или в другом месте * атрибута eol
файла XML тоже.Эти не должны быть релевантными, если файл не считается текстовым, но лучше минимизировать площадь поверхности, на которую влияют ошибки.По тем же причинам я бы порекомендовал удалить любую конфликтующую спецификацию для атрибута 'text' XML-файла.
Не забудьте зафиксировать ваш новый / измененный .gitattributes
файл (-ы), по крайней мере, в вашей локальной копии.
* «В другом месте» означает в другом файле .gitattributes
ближе к корню дерева, или в <repo_root>/.git/info/attributes
, если таковой существует.