TFS: Несоответствия в браузере исходного кода git

Мы использовали локально Team Foundation Server v. 15.117.27414.0 .

Все работает нормально, за исключением веб-портала проекта, на кодовой странице (обозреватель кода), все файлы, которые находятся в репозитории git, не отображаются. Например, у нас есть проект MVC с папкой Models, и есть 11 классов, но только 7 из них отображаются на веб-странице. Есть и другие проблемы с отображением проекта. Например, есть две папки проекта с одинаковым именем (с одним символом, регистр не совпадает), с похожим содержимым, хотя на самом деле он должен быть.

sidebar shows two folders with same name - yet not all the files!

Все это просто сбивает с толку. В остальном все работает нормально. Мы можем клонировать проект или загрузить его в виде zip-архива со всеми файлами. Просто сбивает с толку то, как он отображается на вкладке «Код» на портале TFS.

1
задан 2 February 2019 в 18:48
1 ответ

Git - система управления версиями с учетом регистра. Таким образом, он позволяет коммитировать файлы и папки, отличающиеся только регистром. Это абсолютно легально и то, что Azure DevOps и Team Foundation Server (а на самом деле каждый Git-хостинг-провайдер) должен разрешить и поддержать.

Вы можете увидеть это, запустив git ls-tree HEAD в своём репозитории. Он покажет файлы в обоих случаях.

Случилось одно из двух:

  • Кто-то клонировал ваш репозиторий на чувствительной к регистру файловой системе (например, Linux) и создал директорию, которая отличается только случаем, добавил в неё файлы и зафиксировал их. Это довольно маловероятно .
  • Намного больше вероятно, что кто-то клонировал их репозиторий на регистрозависимуюнечувствительную к регистру файловую систему (такую как Windows) и отключил функцию 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

6
ответ дан 3 December 2019 в 16:43

Теги

Похожие вопросы