Ответ 1
Это может быть вызвано файлом .gitattributes
, указывающим на git, что он должен выполнять нормализацию EOL, но репозиторий, содержащий ненормированные окончания строк.
Простое исправление - удалить соответствующую строку из .gitattributes
. Это может быть
* text=auto
или
*.cs text
Быстрый пример того, как это могло произойти, выглядит следующим образом:
$ echo "Hello World" > example.txt
$ unix2dos example.txt #Make sure it uses CRLF
$ git add example.txt
$ git commit -m "commit 1"
$ #Instruct git that all .txt files should be normalized
$ echo '*.txt text' >> .gitattributes
$ git add .gitattributes
$ git commit -m "commit 2"
Теперь репозиторий находится в странном состоянии, потому что .gitattributes
утверждает, что файл должен быть нормализован, прежде чем добавлять его в индекс, но текущая версия не нормализована.
Однако на данный момент git status
не замечает этого, потому что сам файл не изменился по размеру или mtime, поскольку он был добавлен в индекс, поэтому индекс считается актуальным:
$ git status
On branch master
nothing to commit, working directory clean
Но все, что делает недействительным индекс, заставит git считать файл грязным:
$ touch example.txt
On branch master
Changes not staged for commit:
modified: example.txt
no changes added to commit (use "git add" and/or "git commit -a")
И git reset --hard
или любое другое действие, чтобы попытаться выполнить reset файл в состояние, в котором он должен находиться, не будет исправлять это. Это связано с тем, что нет способа добавить файл в индекс в текущее состояние, как оно есть в репозитории, потому что git было поручено нормализовать этот файл, и эта нормализация не может когда-либо создавать объект, поскольку он в настоящее время зафиксирован.
Вот почему справочная страница GITATTRIBUTES(1)
рекомендует явно аннулировать весь индекс при введении нормализации строки так:
$ echo "* text=auto" >>.gitattributes
$ rm .git/index # Remove the index to force Git to
$ git reset # re-scan the working directory
$ git status # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"
Подробнее читайте в разделе "Окончательное преобразование строки" на странице gitattributes.
Вместо того, чтобы быстро исправить просто удаление этой строки из .gitattributes
, вы можете захотеть вместо этого сохранить правила прекращения строки и продолжить и нормализовать их сейчас. Это в основном означает совершение 20 + изменений, которые не исчезнут, но вы можете сделать это методично, следуя приведенным выше инструкциям о введении нормализации окончания строки (минус редактирование .gitattributes
), а затем чувствуя уверенность, что это не будет повторюсь, потому что теперь все файлы завершены с нормализованными окончаниями, и любые будущие файлы, которые вы добавите, также будут нормализованы. Это личное предпочтение, в основном.