Назад | Перейти на главную страницу

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

Мы использовали локальную версию 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 в вашем репозитории. Он покажет файлы в обоих вариантах регистра.

Произошло одно из двух:

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