Неразрешимая ошибка Git: следующие неотслеживаемые файлы рабочего дерева будут перезаписаны извлечением - PullRequest
5 голосов
/ 12 января 2012

Я использую один Git для своего локального программного проекта в Visual Studio 2010. Недавно я создал новую ветвь для более масштабного рефакторинга одного из окон диалога.Я сделал следующие изменения:

  • Переименование формы Form1 в Form1a (включая все зависимые файлы)
  • Добавление новой формы Form1

Я проверил это изменение в веткеСкажем, форма-рефакторинг.Интересно, что Git не заметил, что я переименовал файл Form1.cs в Form1a.cs и создал новый, совершенно другой Form1.cs, но вместо этого он заметил новый файл Form1a.cs и обнаружил множество различий междупредыдущие и новые файлы Form1.cs.Это, конечно, приведет к созданию полностью разнородных различий, но в данном случае мне все равно, если в итоге все файлы будут обработаны правильно.

Затем я переключился на master, чтобы внести некоторые другие небольшие изменения.Ничего противоречивого.До сих пор все работало нормально.

Сегодня я хотел вернуться к рефакторингу формы моего филиала, чтобы продолжить эту работу.Но все, что я получаю, это следующее сообщение:

git.exe checkout    form-refactoring

Aborting
error: The following untracked working tree files would be overwritten by checkout:
Form1.Designer.cs
Please move or remove them before you can switch branches.

Что это должно быть?Упомянутый файл не отслежен.Ни в основной ветке, ни в ветке рефакторинга форм.Это часть обеих ветвей, но одна не является потомком другой.Что произойдет, если я удалю его?Я не верю, что Git вернет правильный файл, если я что-то сейчас удалю.Я вообще не играл ни с одним файлом, кроме упомянутых выше операций Git, так почему я должен играть с любым файлом, чтобы продолжить использовать операции Git сейчас?Git сломал это, Git должен справиться с этим сейчас!

Прямо сейчас я не могу продолжать свою работу, потому что я не могу переключать ветви.Есть ли простое решение для этого?

Git версия 1.7.6, TortoiseGit 1.7.3.

Ответы [ 5 ]

18 голосов
/ 28 февраля 2012

Параметр конфигурации core.ignorecase не был установлен, и Visual Studio переименовал файл .Designer.cs в случае, переключившись с заглавной буквы на «D» (или наоборот).Это была проблема в конце.Мне потребовалось некоторое разделение истории файлов (удаление и повторное добавление файлов), чтобы устранить эту ошибку после установки значения true.На самом деле опция была установлена ​​на одном компьютере, но при клонировании хранилища настройка как-то терялась.И тогда судьба ждала, пока VS переименует этот файл, чтобы поймать меня.

Поэтому в Windows вам всегда нужно убедиться, что эти две настройки верны после любой операции инициализации / клонирования:

git config core.ignorecase true
git config core.autocrlf false

Некоторые инструменты (TGit, gitscc и т. Д.), Кажется, не делают это правильно.Это абсолютно необходимо для нормальной работы в Windows, но Git не волнует, правильно ли они настроены, и просто позволяет вам наткнуться на них, не говоря вам, почему.В этом столько же лжи, сколько и полезно.

0 голосов
/ 02 апреля 2015

Это решило проблему для меня:

rm .git/fs_cache
0 голосов
/ 12 января 2012

Кажется, что ветвь XXX (форма-рефакторинг) содержит этот файл, а YYY - нет. И теперь вы пытаетесь перейти из ветви YYY в XXX. Git боится, что вы просто забудете добавить файл, чтобы он не позволил перейти в другую ветку.

Используйте

git status

, чтобы определить, является ли этот файл (Form1.Designer.cs) неотслеживаемым. В этом случае просто зафиксируйте его, и тогда вы сможете безопасно перейти в другую ветку

0 голосов
/ 13 января 2012

Прежде всего, Git не обманывает вас .Файл действительно отслеживается в ветке, и действительно существует в рабочем дереве, и действительно не отслеживается.

Учитывая, что вы предлагаете в комментариях в другом месте, что файл не отображается в diffs или даже git status Похоже, вы добавили его в свой gitignore (возможно, непреднамеренно через шаблон подстановки).Я знаю, что вы сказали, что этого не сделали, но если он не отображается на выходе git status как неотслеживаемый файл, то он не отслеживается и игнорируется.Чтобы проверить это, вы можете перечислить все файлы, игнорируемые .gitignore:

git ls-files -i --exclude-from=.gitignore

Вы также можете перечислить все неотслеживаемые файлы, проигнорированные или нет:

git clean -xdn

(Вы, кажется, говорите, чтовы очень уверены, что файл отслеживается - если бы это действительно было так, git show HEAD:path/to/file показывал бы зафиксированное содержимое файла. Однако я подозреваю, что вместо этого это скажет "fatal: Path 'path / to / file' несуществовать в 'HEAD' ".)

Еще один способ проверить, что файл не отслежен и игнорируется, - просто переименовать его, а затем посмотреть, сообщает ли git status о том, что он удален;если это не так, то оно не отслеживалось.

Предполагая, что в этом списке указан файл, вы должны изучить файл в своем рабочем дереве.Вы можете увидеть, какую версию файла имеет другая ветвь, используя git show other-branch:path/to/file, для сравнения.Если вы уверены, что вам не нужна версия в вашем рабочем дереве, просто удалите ее.Если вы обеспокоены тем, что вам это может понадобиться, переименуйте его или переместите из каталога.Если вы понимаете, что вам это нужно, вы должны выяснить, какой шаблон игнорирования игнорирует его, удалить его, добавить и зафиксировать.В любом случае, как только вы разберетесь с файлом, вы сможете переключать ветви.

0 голосов
/ 12 января 2012

Git не позволяет переключать ветки, если есть вероятность потери данных.

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

git reset --hard HEAD

команда. Но я настоятельно не рекомендую это делать. Используйте

git stash

команда для сохранения ваших изменений во внутреннем хранилище. В этом случае вы всегда можете восстановить свои данные.

...