Я работаю над большим и сложным корпоративным проектом и столкнулся с проблемой с файлами решений Git и Visual Studio (.sln). У меня есть два файла .sln, которые Git определяет как полностью отредактированные, но когда я сравниваю файлы с помощью WinMerge или Beyond Compare, различий между рабочей областью и последней фиксацией нет. Файлы идентичны, включая EOL, пробелы и т. д.
Вот что я пробовал:
git diff <commit-sha> --ignore-space-change -- <path>
Это приводит к тому, что различий не обнаружено.
Когда я запускаю команду без флага --ignore-space-change:
git diff <commit-sha> -- <path>
Git показывает разницу как @@ -1,20 +1,20 @@, что указывает на то, что 20 строк удалены и 20 добавлены, хотя содержимое абсолютно такое же, а весь файл состоит всего из 20 строк.
Самое запутанное то, что когда я складываю эти два файла, они добавляются в область тайника, но все равно появляются в разделе «Изменения». Даже если я восстановлю файлы, используя:
git restore --source=<commit-sha> <path>
Я все еще вижу эти файлы, помеченные как измененные.
Я застрял в том, как решить эту проблему. Любая помощь или идеи будут очень признательны.
Спасибо!
Раньше у меня была подобная проблема, и она была связана с сохранением файла как UTF-X вместо ANSI.
@RossBush, используя Beyond Compare с командой git difftool <commit-sha> <path>, я вижу, что оба файла находятся в формате UTF-8 со спецификацией. Кроме того, в Beyond Compare я включил правила, которые всегда учитывают важные следующие элементы: начальные пробелы, встроенные пробелы, конечные пробелы, все остальное, регистр символов, потерянные строки и сравнение окончаний строк (ПК/Mac/Unix). Несмотря на эти настройки, различий между файлами не обнаружено.
«Самое запутанное то, что когда я складываю эти два файла, они добавляются в область тайника, но все равно появляются в разделе «Изменения». Даже если я восстанавливаю файлы, используя: «Этот файл странный. Похоже на нарушенные права доступа к папке/файлу в .git
— папке.
Я проверил права доступа к файлу и его родительской папке в Ubuntu и подтвердил, что они идентичны как в рабочем каталоге, так и в последнем коммите. Сегодня утром я выполнил свежее клонирование репозитория, и что интересно, сразу после клонирования git подсвечивает эти два файла как измененные.
Кажется, я нашел проблему!
В нашем файле .gitattributes есть строка:
*.sln text eol=crlf
После закомментирования этой строки Git больше не видит прошлых различий.
Я не совсем понимаю, почему это происходит, ведь файлы уже были в формате CRLF и остаются в них до сих пор. Если у кого-то есть объяснение, я хотел бы его услышать.
Может ли это быть связано с пробелами/переносом строки?