Мы использовали локально Team Foundation Server v. 15.117.27414.0
.
Все работает нормально, за исключением веб-портала проекта, на кодовой странице (обозреватель кода), все файлы, которые находятся в репозитории git, не отображаются. Например, у нас есть проект MVC с папкой Models, и есть 11 классов, но только 7 из них отображаются на веб-странице. Есть и другие проблемы с отображением проекта. Например, есть две папки проекта с одинаковым именем (с одним символом, регистр не совпадает), с похожим содержимым, хотя на самом деле он должен быть.
Все это просто сбивает с толку. В остальном все работает нормально. Мы можем клонировать проект или загрузить его в виде zip-архива со всеми файлами. Просто сбивает с толку то, как он отображается на вкладке «Код» на портале TFS.
Git - система управления версиями с учетом регистра. Таким образом, он позволяет коммитировать файлы и папки, отличающиеся только регистром. Это абсолютно легально и то, что Azure DevOps и Team Foundation Server (а на самом деле каждый Git-хостинг-провайдер) должен разрешить и поддержать.
Вы можете увидеть это, запустив git ls-tree HEAD
в своём репозитории. Он покажет файлы в обоих случаях.
Случилось одно из двух:
core.ignorecase
. core.ignorecase
инструктирует Git, что вы находитесь в файловой системе, не чувствительной к регистру, и что если вы запустите git добавляет FOO/file.txt
, когда в репозитории уже есть каталог с именем foo
, то вы на самом деле хотите использовать существующий каталог .core.ignorecase
- это не та настройка, которая должна быть изменена. Это не вариант. Это кэшированное значение. Git обнаруживает возможности вашей файловой системы при создании репозитория (чувствительность к регистру, возможности Unicode) и кэширует их так, чтобы не было необходимости заново обнаруживать эту информацию по каждой команде.
Это значение не предназначено для изменения, иначе вы рискуете такими проблемами.
Для решения этой проблемы вы можете переименовывать репозиторий из одного регистра в другой. Например, если у вас есть хранилище, содержащее папку с именем foo
и другую папку с именем FOO
. Представьте, что у вас есть два файла, foo/bar
и FOO/baz
:
% git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 FOO/baz
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 foo/bar
Для решения этой проблемы решите, какое имя вы хотите сохранить (foo
или FOO
), и переименуйте другой. Вам нужно использовать git mv
с флагом -f
:
% git mv -f FOO/baz foo/baz
% git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: FOO/baz -> foo/baz
Вы можете это проверить для решения проблемы.
Если у вас есть два файла с одинаковым именем, но которые отличаются в случае, вам нужно решить, какое имя сохранить.
% git ls-files --stage
100644 ba578e48b183662ddf9b38682cc52fb80066ce6d 0 FOO/bar
100644 5716ca5987cbf97d6bb54920bea6adde242d87e6 0 foo/bar
Для удаления другого файла используйте флаг --cached
для git rm
, чтобы предотвратить его удаление с диска.
% git rm --cached FOO/bar
% git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: FOO/bar