#Как проявляется ошибка и когда применим способ
На Windows переименование readme.md в README.md может не отражаться в истории Git, поскольку файловая система обычно не различает регистр имён, а core.ignorecase учитывает такую особенность. При этом на Linux два имени могут быть разными файлами, что важно для сборки.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файловая система не различает регистрОбычное переименование только заглавных букв не приводит к видимому изменению имени. | git status остаётся чистым, хотя отображение имени в Проводнике изменилось. | Сделать промежуточное переименование через git mv. |
| В репозитории уже есть конфликт имёнВ истории записаны два файла, различающиеся только регистром. | Windows показывает один файл либо предупреждает при checkout. | Разрешить конфликт имён в поддерживаемой среде. |
#Пошаговая диагностика и решение
- 1. Убедитесь, что меняется только регистрОткройте Проводник Windows и найдите файл в корне проекта. Запишите точное исходное имя и желаемое новое имя. Не исправляйте автоматически регистр у многих файлов: это может нарушить импорты на Linux и ссылки на пути.
- 2. Проверьте настройку Git и состояние файловВ Git Bash или PowerShell из папки проекта выполните git status --short и git config --get core.ignorecase. На типичном томе Windows значение true ожидаемо, но его отсутствие или другое значение само по себе ещё не ошибка. Если есть другие локальные правки, сохраните их.
- Без измененийLinux · Терминал (Bash)КомандаБез изменений. Проверяет отслеживаемые правки и параметр учёта регистра.
git status --shortgit config --get core.ignorecase
- 3. Посмотрите точное имя, известное GitВыполните git ls-files | найдите строку нужного файла с помощью поиска терминала. В PowerShell можно использовать Select-String, в Git Bash — grep. Важно проверить именно имя в индексе, а не только то, что визуально показывает Проводник.
- Показывает имена файлов в индексе, не меняет файлыLinux · Терминал (Bash)КомандаПоказывает имена файлов в индексе, не меняет файлы.
git ls-files
- 4. Переименуйте через временное уникальное имяЕсли нужен переход file.txt → FILE.txt, сперва выполните git mv file.txt __rename_temp__.txt, затем git mv __rename_temp__.txt FILE.txt. Временное имя должно быть действительно свободно. Git отследит изменение пути даже при нечувствительности файловой системы к регистру.
- Пример для проверенных имён; изменения в индексе и рабочей папке, только в тестовой веткеLinux · Терминал (Bash)С осторожностьюПример для проверенных имён; изменения в индексе и рабочей папке, только в тестовой ветке.
git mv file.txt __rename_temp__.txtgit mv __rename_temp__.txt FILE.txtКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 5. Проверьте изменения и ссылкиСделайте git diff --cached --name-status и убедитесь, что отражено переименование, а не случайное удаление другого файла. Найдите в проекте импорты, пути в конфигурации и ссылки, использующие прежний регистр. Для Linux точный регистр путей важен.
- Показывает подготовленное переименование, ничего не записываетLinux · Терминал (Bash)КомандаПоказывает подготовленное переименование, ничего не записывает.
git diff --cached --name-status
- 6. Сохраните коммит и протестируйте переносЕсли переименование корректно, создайте коммит с ясным сообщением в своей тестовой ветке. Проверьте приложение на Windows и, если проект развёртывается на Linux, на соответствующей тестовой сборке. При ошибке верните имя через обратный git mv, не изменяя глобальный core.ignorecase.
#Проверка результата и действия при повторении
Успех: git diff --cached или история нового коммита показывает переименование на требуемый регистр, в Git и на Linux путь совпадает с импортами, а сборка проходит.
Если на указанном шаге результат отличается, остановитесь и запишите первое полное сообщение об ошибке, версию инструментов и проверенное состояние до исправления. Не переходите к опасным действиям на действующем проекте: повторите проверку на отдельной копии, верните сохранённые файлы и только затем выбирайте следующую причину.