Почему файлы считаются измененными после свежего клона? Когда есть git add --renormalize . используемый?
У меня проблема с файлами, которые рассматриваются как измененные после свежего клона git.
- все текстовые файлы должны иметь
eol=LF
, Кроме*.txt
файлы, которые должны иметьeol=CRLF
,
Вот как .gitattributes
похоже:
* text=auto
*.txt text eol=crlf
*.png binary
*.jpg binary
*.bmp binary
Вот мои тесты:
- новый репо с 2 .txt файлами (LF.txt и CRLF.txt)
LF.txt
: eol = LF (конец строкиLF
во всем файле)CRLF.txt
: eol = CRLF (конец строкиCRLF
во всем файле)
- добавить, зафиксировать, нажать
- добавлять
.gitattributes
(с содержанием, описанным выше):git add .gitattributes
, совершить, нажать - свежий клон репо
LF.txt
: eol сейчасCRLF
(как и ожидалось)CRLF.txt
считается измененным, даже если он все ещеCRLF
как eol
- новый репо с 2 .txt файлами (LF.txt и CRLF.txt)
LF.txt
: eol = LFCRLF.txt
: eol = CRLF
- добавить, зафиксировать, нажать
- добавлять
.gitattributes
(с содержанием, описанным выше):git add --renormalize .
CRLF.txt
рассматривается как измененный и поэтапный (но нет никаких различий в содержании, и eol все ещеCRLF
).gitattributes
все еще не прослежен
- трек
.gitattributes
:git add .
- совершить и подтолкнуть
- свежий клон репо
LF.txt
: eol сейчасCRLF
(как и ожидалось)CRLF.txt
: eol isCRLF
(как в начале)- репо чисто
Дополнительная информация
- ОС: Windows 10
- версия git: 2.20.1.windows.1
Вопросы
- Тест 1: почему CRLF.txt видится модифицированным после свежего клона?
- Тест 2: что такое
git add --renormalize .
на самом деле делать? Почему не ставить.gitattributes
также? - При настройке
.gitattributes
в репо, который уже имеет некоторую историю, рекомендуется запуститьgit add --renormalize
во избежание изменения файлов после свежего клона?
1 ответ
Тест 1: почему CRLF.txt видится модифицированным после свежего клона?
Потому что ты солгал git: ты сказал git, что конец строки для CRLF.txt
в вашем репозитории есть окончания строк в стиле Unix (LF), но вы хотите, чтобы в рабочей папке были окончания строк в стиле Windows (CRLF). Вот чтоtext
Атрибут означает: нормализовать окончания строк, чтобы они имели окончания строк в стиле Unix в хранилище.
Нопервым шагом было добавление файла с окончаниями строк в стиле Windows в хранилище.
Таким образом, git может просмотреть файл на диске, преобразовать его окончания строк в стиле Windows (CRLF) в обычную форму (окончания строк LF в стиле Unix) и сравнить результаты с тем, что находится в хранилище.
Это содержимое не совпадает. Таким образом, он думает, что вы изменили файл.Вот почему вы перенормируете файлы.
Тест 2: что такое git add --renormalize . на самом деле делать?
Он обновляет файлы, чтобы соответствовать тому, что вы заявили в .gitattributes
, Когда вы добавляете.gitattributes
Вы не меняете содержимое файлов на диске или в хранилище. Но вы можете(и в данном случае) изменяете свои утверждения о том, как содержимое существует в хранилище.
Если содержимое репозитория не соответствует действительности, о котором вы заявляли, тогда git add --renormalize
исправлю это.
Почему он также не ставит.gitattributes?
Перенормировка влияет только на файлы, уже находящиеся в хранилище, она применяет процесс "очистки" заново ко всем отслеживаемым файлам, чтобы принудительно добавить их снова в индекс ". (Из документации git; выделение мое.)
Так что это действительно только перенормирует существующий контент.
При настройке.gitattributes в репо, который уже имеет некоторую историю, рекомендуется запускать git add --renormalize, чтобы избежать изменения файлов после свежего клона?
Да.