Это хорошая идея, чтобы установить git config core.ignorecase в false? - PullRequest
0 голосов
/ 02 октября 2019

Моя команда в настоящее время управляет git-репо в нескольких файловых системах. Большинство из нас используют Windows, но некоторые используют Linux. Кроме того, мы развертываем наш производственный код на сервере Linux. Это привело к многочисленным проблемам с регистром имен файлов в нашей кодовой базе (т.е. импорт Foo.js, когда файл на самом деле foo.js). Недавно я завершил очистку папки нашего проекта, которая состояла в основном из реорганизации наших каталогов и переименования наших каталогов / файлов в общий стандарт именования. Многие из этих изменений имени файла меняли регистр файла (например, foo.js -> Foo.js).

Я не был полностью осведомлен о том, как git по-разному обрабатывает имена файлов в зависимости от регистра и в сравнении с регистромфайловые системы, когда я делал эти изменения, и это приводило ко многим странным ошибкам. Одна вещь, с которой я столкнулся при исследовании этого, была ignorecase значение в .gitconfig.

Из документации git-config:

Внутренняя переменная, которая позволяет использовать различные обходные путиGit лучше работает с файловыми системами, не чувствительными к регистру, такими как APFS, HFS +, FAT, NTFS и т. Д. Например, если список каталогов находит «makefile», когда Git ожидает «Makefile», Git будет считать, что это действительно тот же файли продолжайте помнить его как «Makefile».

Git полагается на правильную конфигурацию этой переменной для вашей операционной и файловой системы. Изменение этого значения может привести к неожиданному поведению.

Из того, что я могу понять из этого, установка ignorecase = true сделает так, что если git обнаружит то же имя файла, но с другим регистром,он изменит имя в индексе git в соответствии с тем, что находится в файловой системе (т. е. если Windows имеет foo.js, а git checkout / pull имеет Foo.js, он будет считать, что foo.js является правильным, и git будет использовать этот регистр). Меня беспокоит то, что произойдет, если я перейду на удаленный сервер, и наш сервер развертывания примет изменения. Затем он попытается импортировать Foo.js, который не существует и выдает ошибку.

Однако, установив ignorecase = false, git сможет обнаружить разницу в именах файлов и правильно заменитьфайлы. Это правильно, и мне нужно, чтобы моя команда установила это значение в false, потому что мы работаем в разных файловых системах?

Я читал посты, где люди говорят, что вы должны это делать, и некоторые посты, в которых говорится точнонапротив.

1 Ответ

1 голос
/ 02 октября 2019

Из того, что я могу понять из этого, установка ignorecase = true сделает так, что если git обнаружит то же имя файла, но с другим регистром, он изменит имя в индексе git в соответствии с тем, чтонаходится в файловой системе (т. е. если Windows имеет foo.js, а git checkout / pull имеет Foo.js, он будет считать, что foo.js правильный и git будет использовать этот регистр).

Нет, это наоборот: в документации говорится, что если в настоящее время индекс содержит Foo.js, а у рабочего дерева по какой-либо причине - foo.js, Git будет считать, что foo.js действительно Foo.js, и помещает Foo.js в следующий коммит. Однако, если для core.ignorecase установлено значение false, Git полностью верит рабочему дереву: git add . удалит имя (и содержимое) в верхнем регистре и использует имя foo.js в нижнем регистре для установки новой копии в индексе на основекопия в рабочем дереве.

(Чтобы увидеть, что в индексе, используйте git ls-files --stage или пропустите --stage, чтобы получить только имя файла. Обратите внимание, что при этом выводится все содержимое индекса! Добавьте аргументы пути для выбора определенных файлов, например, git ls-files "[Ff]oo.js", чтобы искать только эти файлы. Кавычки необходимы в Unix-подобных оболочках, таких как bash, чтобы оболочка не интерпретировала метасимволы [Ff] здесь. удалит кавычки. Что использовать в других специфичных для Windows интерпретаторах командной строки, я не уверен.)

В общем, вы не должны изменять core.ignorecase. Если вы хотите переименовать файл, самый простой способ - использовать git mv (для одновременной настройки как индекса, так и рабочего дерева). Если вы хотите изменить только регистр, вы можете git mv дважды:

git mv foo.js temporary-name
git mv temporary-name Foo.js

, и теперь у вас есть Foo.js с начальным капиталом в индексе и рабочем дереве. Некоторые версии Git могут иметь дело с этим без промежуточного временного имени, но все будут делать правильно, если вы используете промежуточное имя.

...