Git считает, что у вас есть два разных файла в каталоге / папке Project
:
MYClass.cs
(прописные буквы M
, прописные буквы Y
, прописные буквы C
, строчные буквы lass.cs
) MyClass.cs
(прописные буквы M
, строчные буквы y
, прописные буквы C
, строчные буквы lass.cs
)
Git открывает каждое имя файла отдельно, записываетсодержимое этого файла и закрывает его.
Поскольку вы работаете в Windows, которая отказывается создавать два разных файла, имена которых отличаются только в case , ваша ОС перезаписывает один из двух файлов с другим, оставляя только один из двух корпусов на месте.Ваша ОС не позволит Git иметь два файла в рабочем дереве.Git может (и имеет) оба файла в index , потому что индекс Git на самом деле является файлом данных, а не каталогом / папкой.Поскольку Git делает свои коммиты из индекса, Git может делать новые коммиты, которые по-прежнему содержат два разных файла, имена которых отличаются только регистром.
Вы должны обновить свой индекс, чтобы он содержал только one такое имя, иначе вы обречены на Windows (и MacOS), чтобы навсегда бороться с этой проблемой.Самый простой способ - это исправить в системе Linux или Unix, где индекс и рабочее дерево остаются синхронизированными, поскольку ОС может создавать и создает два разных файла, имена которых отличаются только в случае.
Hardможно использовать git rm --cached
: дать ему имя, которое вы действительно хотите удалить.Git удалит этот файл из индекса, не затрагивая рабочего дерева вообще.Теперь, когда индекс имеет правильный регистр, вы можете исправить регистр в рабочем дереве, чтобы он соответствовал, однако это делается в Windows - в других системах обычная хитрость:
mv NameWithCASEISSUE x # change the whole name a lot, using a safe name
mv x NameWithCaseIssue # change it back, using the correct case this time
Теперь вы можетесравните индексную версию с версией рабочего дерева и внесите любые корректировки, которые могут потребоваться.Поскольку существует только одна индексная версия, которая будет соответствовать файлу рабочего дерева, независимо от проблем с делами (которых сейчас нет, поскольку вы тщательно сопоставили случаи с именами файлов), вы можете выполнить свою работу.
Действительно неудачный случай (если я могу использовать это слово :-)) возникает, когда вы действительно делаете хотите оба имени файла, отличающиеся только регистром, индексом и последующими коммитами.Нет хороших инструментов для борьбы с этим.Теоретически возможно построить такие инструменты вокруг команд git update-index
и git checkout-index
, но в настоящее время они не существуют.