#Что означает проблема
На файловых системах, где имена Assets и assets считаются одним каталогом, простая смена регистра букв может не попасть в индекс Git. При этом на сервере Linux регистр важен: импорт ./assets/... из папки Assets способен перестать работать. Исправление — явная фиксация переименования в индексе без отключения глобальной защиты и без массовых перенастроек Git.
#Как отличить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Файловая система не различает регистр имёнWindows и часть конфигураций macOS сопоставляют имена без различия регистра. | В проводнике виден config, но git status пишет working tree clean. | Сделать переименование через временное непересекающееся имя. |
| Git использует core.ignorecaseНастройка отражает способ обращения файловой системы с именами. | git config --get core.ignorecase возвращает true. | Не меняя настройку вслепую, используйте git mv. |
Внутри репозитория уже есть конфликт имёнВ истории могут одновременно встречаться пути Config/ и config/, а ОС отображает только один. | git ls-files содержит варианты регистра либо операция переименования отказывается. | Работать на файловой системе с учётом регистра и согласовать структуру. |
#Пошаговая диагностика и решение
- Откройте терминал именно из корня нужного репозиторияВ Windows откройте проект в VS Code, затем «Терминал» → «Создать терминал» (можно выбрать Git Bash). В macOS/Linux подойдёт обычный Терминал. Выполните
git status -sbи посмотрите, нет ли уже других изменений. Если есть, сначала сохраните их в отдельном коммите или копии, чтобы переименование не смешалось с чужой работой. Перед остальными командами выполнитеgit --version: в ответ должна появиться установленная версия Git. Если терминал сообщает, чтоgitне найден, проверьте установку Git и доступность команды в этом терминале; не продолжайте операции наугад. - Посмотрите, как Git запомнил имя папкиВведите
git ls-filesи найдите пути с предполагаемым старым именем, напримерConfig/settings.json. Git отслеживает файлы, а не пустые каталоги; если внутри папки нет отслеживаемых файлов, отдельного переименования для Git не существует. Сравните список с реальными именами файлов в проводнике. - Проверьте поведение файловой системы, не меняя конфигурациюВыполните
git config --get core.ignorecase. Значениеtrueобъясняет, почему простая смена регистра может не фиксироваться. Пустой вывод означает отсутствие локально заданного параметра, не доказательство чувствительности файловой системы. Не устанавливайте автоматическиcore.ignorecase=falseна Windows: это не превратит NTFS в чувствительную к регистру систему. - Проверьте, что конечное имя и временное имя свободныОткройте каталог проекта в Проводнике/Файлах и убедитесь, что папки
Config_case_tmpнигде нет. НижеConfig— только пример, а итогом будетconfig: замените оба имени собственными. При несоответствии или коллизии имён остановитесь; нельзя перезаписывать другое дерево файлов. - Переименуйте каталог в промежуточное имя через GitВ терминале корня проекта выполните
git mv Config Config_case_tmp. Если Git выдаётbad source, сначала проверьте фактический регистр черезgit ls-filesи что в каталоге есть отслеживаемые файлы. Если Git жалуется на незарегистрированные файлы, сохраните их копию до продолжения. Команда перемещает файлы и обновляет индекс; на важном проекте лучше выполнять в отдельной рабочей ветке. - Задайте конечный регистр вторым переименованиемПосле успешного первого шага выполните
git mv Config_case_tmp config. Проверьте в Проводнике, что папка теперь называетсяconfig, и выполнитеgit status --short: в выводе должны появиться строкиR(переименовано) либоD/Aдля перемещённых файлов. Git может показать переименование сRтолько при включённом определении переименований; отсутствие R само по себе не ошибка. - Проверьте все пути в коде и зафиксируйте результатОткройте поиск по проекту в VS Code сочетанием Ctrl+Shift+F (на macOS — Cmd+Shift+F) и найдите старое имя
Config/в импортируемых путях. Исправьте только ссылки, для которых регистр должен стать новым; запустите тесты на окружении, различающем регистр, если оно доступно. Затем изучитеgit diff --cached --statиgit diff --cached --summary, выполнитеgit commitтолько после проверки. - Если операция не удалась, отмените перенос аккуратноДо коммита, если в ходе
git mvвы не правили содержимое файлов и нет других локальных изменений, переименование можно выполнить в обратном порядке черезgit mv config Config_case_tmpиgit mv Config_case_tmp Config. Если Git пишетdestination exists, ничего не перезаписывайте: верните файлы из копии и посмотрите статус. После публикации переименования отменять его следует новым коммитом, а не принудительной переписью истории.
#Команды для проверки и исправления
git status -sbgit ls-filesgit config --get core.ignorecaseConfig, который должен стать config; замените оба имени в двух строках. Запускайте строки ПО ОЧЕРЕДИ, убедившись в успехе первой. Создайте отдельную ветку и копию данных, особенно при наличии неотслеживаемых файлов.git mv Config Config_case_tmpgit mv Config_case_tmp configКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
git diff --cached --summarygit status --short#Как проверить результат и что делать, если не помогло
После коммита на другой системе или в чистом клоне git ls-files должен показывать исключительно новый регистр. Сборка/импорты должны работать и на Linux. Если присутствуют оба регистра одного пути, нужно разбирать конфликт в отдельной копии на чувствительной к регистру файловой системе.