Неиндексированных изменений оставили после ГИТ сброс --жесткий
название говорит само за себя.
после git reset --hard,git status дает мне файлы .
я тоже пробовал git reset .,git checkout -- . и git checkout-index -f -a, но безрезультатно.
Итак, как я могу избавиться от этих неиндексированных изменений?
это, кажется, ударил только файлы проекта Visual Studio. Странный. Смотрите эту вставку:http://pastebin.com/eFZwPn9Z. Что особенного в этих файлах, так это то, что внутри .gitattributes I есть:
*.sln eol=crlf
*.vcproj eol=crlf
*.vcxproj* eol=crlf
и autocrlf имеет значение false в моем глобальном .gitconfig. Может ли это быть как-то связано?
18 ответов:
у меня была та же проблема, и это было связано с . Однако тип файла, который вызвал проблему, не был указан в
.gitattributes.я смог решить эту проблему, просто запустив
git rm .gitattributes git add -A git reset --hard
Git не будет сбрасывать файлы, которые не находятся в репозитории. Итак, вы можете:
$ git add . $ git reset --hardэто будет этап все изменения, которые заставят Git быть в курсе этих файлов, а затем сбросить их.
Если это не работает, вы можете попытаться спрятать и отбросить свои изменения:
$ git stash $ git stash drop
решено!!!
я решил эту проблему, используя следующие stpes
1) Удалите каждый файл из индекса Git.
git rm --cached -r .2) перепишите индекс Git, чтобы забрать все новые окончания строк.
git reset --hardрешение было частью шагов, описанных на сайте git https://help.github.com/articles/dealing-with-line-endings/
У меня была та же проблема, и stash, hard reset, clean или даже все они все еще оставляли изменения. Что оказалось проблемой, так это режим X-файла, который не был правильно установлен git. Это "известная проблема" с git для windows. Локальные изменения отображаются в статусе gitk и git как старый режим 100755 новый режим 100644, без каких-либо фактических различий файлов.
исправление состоит в том, чтобы игнорировать режим файла:
git config core.filemode false
ладно, я вроде как решил проблему.
показалось, что
.gitattributesфайл, содержащий:*.sln eol=crlf *.vcproj eol=crlf *.vcxproj* eol=crlfфайлы проекта отображаются без выгрузки. Я не знаю, почему это так, и я действительно надеюсь, что кто-то, посвященный в пути git, даст нам хорошее объяснение.
мое исправление состояло в том, чтобы удалить эти файлы и добавить
autocrlf = falseпод[core]на.git/config.это не совсем то же самое, что и предыдущая конфигурация, так как она требует, чтобы каждый dev имел
autocrlf = false. Я хотел бы найти лучшее решение.EDIT:
Я прокомментировал компрометирующие строки, раскомментировал их, и это сработало. Что... Я даже не знаю ... !
Возможная Причина # 1-Нормализация Окончания Строки
одна из ситуаций, в которой это может произойти, заключается в том, что рассматриваемый файл был возвращен в репозиторий без правильной конфигурации для окончаний строк (1), в результате чего файл в репозитории либо с неправильными окончаниями строк, либо со смешанными окончаниями строк. Чтобы подтвердить, убедитесь, что
git diffпоказывает только изменения в окончаниях строк (они могут быть не видны по умолчанию, попробоватьgit diff | cat -vчтобы увидеть возврат каретки как литерал^Mписьмена.)впоследствии, кто-то, наверное, добавил
.gitattributesили измененcore.autocrlfнастройка нормализации окончаний строк (2). На основе.gitattributesили global config, Git применил локальные изменения к вашей рабочей копии, которые применяют запрошенную нормализацию конца строки. К сожалению, почему-тоgit reset --hardне отменяет эти изменения нормализации строки.решение
обходные пути, в которых локальные окончания линии сбрасываются, не решат проблему проблема. Каждый раз, когда файл "виден" git, он попытается повторно применить нормализацию, что приведет к той же проблеме.
лучший вариант-позволить git применить нормализацию, которую он хочет, нормализовав все окончания строк в репо, чтобы соответствовать
.gitattributes, и совершая эти изменения-см. попытка исправить окончания строк с помощью Git filter-branch, но не повезло.если вы действительно хотите попробовать и отменить изменения в файл вручную самое простое решение, кажется, чтобы стереть измененные файлы, а затем сказать git, чтобы восстановить их, хотя я отмечаю, что это решение, кажется, не работает последовательно 100% времени (ВНИМАНИЕ: НЕ запустите это, если ваши измененные файлы имеют изменения, отличные от окончаний строк!!):
git status --porcelain | grep "^ M" | cut -c4- | xargs rm git checkout -- .обратите внимание, что, если вы не нормализуете окончания строк в репозитории в какой-то момент, Вы будете продолжать работать с этой проблемой.
Возможная Причина #2 - Чехол Нечувствительность
вторая возможная причина-нечувствительность к регистру в Windows или Mac OS / X. Например, скажем, в репозитории существует путь, подобный следующему:
/foo/barтеперь кто-то на Linux фиксирует файлы в
/foo/Bar(вероятно, из-за инструмента сборки или чего-то, что создало этот каталог) и толкает. В Linux, это на самом деле теперь два отдельных каталога:/foo/bar/fileA /foo/Bar/fileAпроверка этого РЕПО на Windows или Mac может привести к изменено
fileAэто не может быть сброшено, потому что при каждом сбросе git на Windows проверяет/foo/bar/fileA, а затем, поскольку Windows нечувствительна к регистру, перезаписывает содержимоеfileAС/foo/Bar/fileA, что приводит к их"модификации".другим случаем может быть отдельный файл(Ы), который существует в РЕПО, который при извлечении в файловой системе, нечувствительной к регистру, будет перекрываться. Например:
/foo/bar/fileA /foo/bar/fileaтам могут быть и другие подобные ситуации, которые могут вызвать такие проблемы.
Git на нечувствительных к регистру файловых системах должен действительно обнаружить эту ситуацию и показать полезное предупреждающее сообщение, но в настоящее время это не так (это может измениться в будущем-см. эта дискуссия и связанные с ними предлагаемые патчи на git.список рассылки ЖКТ).
решение
решение состоит в том, чтобы привести случай файлов в индексе git и случай в файловой системе Windows в соответствие. Это может быть сделано либо на Linux, который будет покажите истинное положение вещей, или на Windows с очень полезной утилитой с открытым исходным кодом Git-Unite. Git-Unite применит необходимые изменения case к индексу git, который затем может быть зафиксирован в репо.
(1) это было, скорее всего, кто-то с помощью Windows, без каких-либо
.gitattributesопределение для рассматриваемого файла и использование глобальной настройки по умолчанию дляcore.autocrlfчто этоfalse(см. (2)).(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
другой причиной для этого может быть нечувствительные к регистру файловые системы. Если у вас есть несколько папок в вашем РЕПО на одном уровне, имена которых отличаются только по регистру, вы получите удар по этому. Просмотрите исходный репозиторий, используя его веб-интерфейс (например, GitHub или VSTS), чтобы убедиться.
для получения дополнительной информации:https://stackoverflow.com/a/2016426/67824
Run очистить:
# Remove all untracked files and directories. (`-f` is `force`, `-d` is `remove directories`) git clean -fd
Проверьте
.gitattributes.в моем случае у меня есть
*.js text eol=lfв нем и Git optioncore.autocrlfбылtrue.это приводит меня к ситуации, когда git автоконвертирует мои файлы в конце строки и мешает мне исправить это и даже
git reset --hard HEADничего не делал.я исправляю это с комментариями
*.js text eol=lfв своем.gitattributesи раскомментировал его после этого.похоже, это просто git magic.
Вы можете
stashпрочь ваши изменения, а затем бросьте заначку:git stash git stash drop
ни один из этих методов не работал для меня, единственным решением было уничтожить все РЕПО и повторно клонировать его. Это включает в себя припрятать, сброс, добавив затем сброс, настройки clrf, чувствительность к регистру и т. д. Вздох..
у меня была та же проблема. Я сделал
git reset --hard HEADно все равно каждый раз, когда я сделалgit statusЯ видел некоторые файлы как измененные.мое решение было относительно простым. Я просто закрыл свою IDE (здесь это был Xcode) и закрыл свою командную строку (здесь это был терминал на моей Mac OS) и попробовал еще раз, и это сработало .
тем не менее, я никогда не был в состоянии найти то, что вызвало проблему.
я попал в аналогичную проблему также с участием
.gitattributes, но в моем случае речь идет о LFS GitHub. Хотя это не совсем сценарий OP, я думаю, что это дает возможность проиллюстрировать то, что . Как правило, записи в.gitattributesукажите, как должны обрабатываться соответствующие файлы. В случае с ОП это было обеспокоенный нормализацией окончаний строк; в моем случае это было то, позволять ли LFS обрабатывать файловое хранилище. В любом случае, на самом деле файл, которыйgitвидит при вычислении agit diffне соответствует файлу, который вы видите при проверке файла. Следовательно, если вы измените способ обработки файла через.gitattributesшаблон, который соответствует ему, он будет отображаться как неустановленные изменения в отчете о состоянии, даже если на самом деле нет никаких изменений в файле.все, что сказал, мой "ответ" на вопрос в том, что если изменение в что-то вы хотели сделать, вы должны просто добавить изменения и двигаться дальше. Если нет, то изменить
.gitattributesчтобы лучше представлять, что вы хотите делать.ссылки
спецификация GitHub LFS - отличное описание того, как они подключаются к
cleanиsmudgeвызовы функций для замены вашего файла вgitобъекты с простым текстовым файлом хэш.gitattributes Documentation - все подробности о том, что доступно для настройки
gitобрабатывает ваши документы.
Я считаю, что есть проблема с git для Windows, где git случайно пишет неправильные окончания строк при оформлении заказа, и единственным обходным путем является проверка какой-либо другой ветви и заставить git игнорировать изменения. Затем проверьте ветку, в которой вы действительно хотите работать.
git checkout master -f git checkout <your branch>имейте в виду, что это отбросит любые изменения, которые вы могли бы намеренно сделать, так что только сделать это, если у вас есть эта проблема сразу после проверки.
Edit: возможно, я действительно получил повезло в первый раз. Оказывается, меня снова укусили после переключения ветвей. Оказалось, что файлы git сообщали о том, что они были изменены после изменения ветвей. (По-видимому, потому, что git не последовательно применял строку CRLF, заканчивающуюся на файлы должным образом.)
я обновился до последней версии git для Windows и надеюсь, что проблема исчезла.
аналогичная проблема, хотя я уверен, что только на поверхности. В любом случае, это может помочь кому-то: что я сделал (FWIW, в SourceTree): спрятал незафиксированный файл, а затем сделал жесткий сброс.
как указывали другие ответы, проблема заключается в автоматической коррекции конца строки. Я столкнулся с этой проблемой с *.файл SVG. Я использовал svg-файл для значков в своем проекте.
чтобы решить эту проблему, я дал git знать, что файлы svg должны рассматриваться как двоичные, а не текстовые, добавив следующую строку .gitattributes
*.бинарные СВГ
если другие ответы не работают, попробуйте добавить файлы, а затем сбросить
$ git add -A $ git reset --hardв моем случае это помогло, когда была куча пустых файлов, которые отслеживал git.
в аналогичной ситуации. В результате многолетних мучений со многими программистами, которые умели набивать разные кодировки концов строк (.asp, .js,.стиль CSS. .. не суть) в один файл. Некоторое время назад отказался .gitattributes. Настройки для РЕПО слева
autorclf = trueиsafecrlf = warn.последняя проблема возникла при синхронизации из архива с разными концами строк. После копирования из архива в статусе git многие файлы изменяются с помощью Примечание
The line will have its original line endings in your working directory. warning: LF will be replaced by CRLF in ...советы Как нормализовать рабочие окончания линий деревьев в Git? помог
git add -u
Comments