Переключение ветвей GIT случайным образом изменяет регистр имени файла

#windows #git #visual-studio-code #git-gui

#Windows #git #visual-studio-code #git-gui

Вопрос:

У меня странная проблема с GIT.

У меня есть репозиторий git для небольшого проекта, над которым я работаю. Пультов нет, это только для моей собственной работы. Еще несколько дней назад моя разработка даже не требовала никаких ветвей.

Мне, наконец, нужно было создать ветку для некоторого экспериментального кода. Когда я закончил, я просто проверил главную ветку, чтобы вернуться туда, где я был. И вот тут начались проблемы.

Существует шесть файлов, которые меняются между новой ветвью и основной ветвью. Каждый раз, когда я переключаю / проверяю любую ветку (переключаясь между двумя), большинство из этих шести имен файлов меняют регистр.

Например, если файл должен был быть someCode.py:

  • Иногда имя файла переключается на somecode.py (Неверно)
  • Иногда имя файла переключается на someCode.py (Правильно)

Неважно, какую ветку я выбираю, результат каждый раз разный. И какие файлы в конечном итоге с каким регистром каждый раз разные.

Сначала я подозревал, что плагин GIT для VSCode, который я использовал (GIT Graph), но это также происходит с включенным графическим интерфейсом GIT, и даже происходит, если я использую «git switch» из командной строки.

Я читал о настройке core.ignorecase; для него было установлено значение True. Я попытался установить для него значение False, и проблема не устранена.

У кого-нибудь есть идеи, что происходит? Спасибо

Подробные сведения:

  • GIT 2.30.0.windows.2
  • Windows 10
  • Файлы находятся на подключенном сетевом диске
  • Файловая система — NTFS

Комментарии:

1. Невероятно, но сегодня я только что слился с чьей-то веткой, которой было больше года, и у меня была такая же проблема. Это проявлялось немного по-другому в том, что первое, что я заметил, был файл с ожидающими изменениями, которые я не мог отменить или сбросить — он продолжал возвращаться как изменение с другим содержимым. Я использовал комментарий, который я написал (2 дня назад!), Чтобы диагностировать проблему, и он точно определил причину. Я просто включил это в свой ответ, поскольку теперь я подтвердил, что это происходит в реальной жизни…

Ответ №1:

Изначально Git чувствителен к регистру, поэтому у вас могут быть два разных файла с именами filename.txt и FileName.txt . В некоторых операционных системах (например, Linux) это работает нормально, а в других (Windows) — нет. Обратите внимание, что то же самое относится и к именам ветвей; у вас не может быть двух разных ветвей, отличающихся регистром только в Windows. Причина этого в том, что имена ветвей хранятся в виде файла на вашем диске.

Скорее всего, ваша проблема в том, что рассматриваемые файлы имеют разные имена в двух ветвях, но отличаются только регистром. Если это так, выберите, какой из них вы хотите (возможно master ), и в другой ветке переименуйте эти файлы, чтобы они точно соответствовали оболочке. Если они на самом деле должны быть разными файлами, измените их имя не только на регистр.

Другая возможность заключается в том, что два (или более) файла с именами, различающимися по регистру, существуют только в одной ветке, и переключение ветвей просто выявляет проблему. Обратите внимание, что это могут быть сами файлы, или это может быть любой из каталогов в пути к этим файлам, которые также могут иметь другой корпус. Чтобы определить, является ли это проблемой, перейдите к корню вашего репозитория в Git Bash и запустите эту команду:

 git ls-tree -r HEAD | grep -i [filename-without-path]
 

Если вы видите два или более файлов с одинаковыми именами, но разными оболочками, вы определили проблему.

Комментарии:

1. Спасибо за ваше предложение. Однако, чтобы использовать ваш пример, файлы никогда не вызывались «filename.txt «. Фактически, ветвь включала только некоторые (незначительные) изменения кода. Файлы не были добавлены, удалены или переименованы.

2. Вы можете просмотреть свой репозиторий в master ветке, чтобы узнать, какими, по его мнению, должны быть имена файлов. Затем вы можете просмотреть файлы на диске (возможно, с помощью другого инструмента или даже другой машины), чтобы увидеть, каковы имена файлов на самом деле. Я подозреваю, что они разные.

3. И, поскольку это общий диск, может ли кто-то / что-то еще переименовать их?

4. Не уверен, что вы подразумеваете под «посмотрите на свой репозиторий в главной ветке, чтобы узнать, какими, по его мнению, должны быть имена файлов». Я не очень хорошо знаком с GIT в командной строке. Тем не менее, я могу использовать опцию просмотра файлов мастера в графическом интерфейсе GIT. Он показывает имена файлов так, как я их ожидаю, с правильным каталогом файлов. С помощью проводника Windows или файлового браузера в VSCode или командной строки имена файлов отображаются так, как они решили на этот раз. И общий диск находится на частном сервере, поэтому никто другой не будет изменять файлы.

5. @Maculin Интересно, что различия не показывают проблемы между ветвями. Возможно, проблема всегда существует, но переключение ветвей просто приводит к выявлению проблемы. Возможно, в репозитории действительно есть две (или более!) Копии этих файлов (даже в одной ветке). Обратите внимание, что это могут быть сами файлы, или это может быть любой из каталогов в пути к этим файлам, которые также могут иметь другой корпус. Перейдите к корню вашего репозитория в Git Bash и попробуйте это : git ls-tree -r HEAD | grep -i [filename-without-path] . Я думаю, что каждый из ваших файлов будет отображаться дважды с разным корпусом.

Ответ №2:

Кажется, я решил проблему — по крайней мере, до определенного момента.

Я создал новую ветку, вручную исправил имена файлов в проводнике Windows. Теперь переключение между master и новой ветвью выполняет все, как ожидалось.

Однако, если я когда-нибудь переключусь на первую ветвь вопроса, проблема снова возникнет. Похоже, что с этой веткой возникла проблема, и переключение в эту ветку и из нее вызывает проблему.

У меня все еще нет ответа на вопрос, почему.

РЕДАКТИРОВАТЬ: хорошо, может быть, нет. Похоже, у Repo снова возникла эта проблема с другими ветвями.