Неиндексированных изменений оставили после ГИТ сброс --жесткий



название говорит само за себя.



после 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. Может ли это быть как-то связано?

781   18  

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 option core.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 видит при вычислении a git diff не соответствует файлу, который вы видите при проверке файла. Следовательно, если вы измените способ обработки файла через .gitattributes шаблон, который соответствует ему, он будет отображаться как неустановленные изменения в отчете о состоянии, даже если на самом деле нет никаких изменений в файле.

все, что сказал, мой "ответ" на вопрос в том, что если изменение в что-то вы хотели сделать, вы должны просто добавить изменения и двигаться дальше. Если нет, то изменить .gitattributes чтобы лучше представлять, что вы хотите делать.

ссылки

  1. спецификация GitHub LFS - отличное описание того, как они подключаются к clean и smudge вызовы функций для замены вашего файла в git объекты с простым текстовым файлом хэш.

  2. 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

    Ничего не найдено.