Ошибка Git: обнаружено 7 файлов, которые должны были быть указателями, но не были

Как очистить репо, если поставленные файлы помечены как измененные?

После

git reset --hard

я получил

Encountered 7 file(s) that should have been pointers, but weren't:

Запуск git clean -fdx тоже не помогает.


person Kate Zz    schedule 12.10.2017    source источник
comment
Это сообщение об ошибке похоже на сообщение git-lfs. На самом деле я не использую git-lfs, поэтому я не уверен в этом (и что с этим делать), но если да, то, возможно, тег git-lfs подойдет.   -  person torek    schedule 12.10.2017
comment
да, lfs используется   -  person Kate Zz    schedule 13.10.2017
comment
@KateZz Вы когда-нибудь находили ответ на это? Мы также используем git-lfs, я только что проверил ветку и получил ту ошибку.   -  person buzzsawddog    schedule 21.12.2017
comment
В этой ситуации легко попасть, если вы добавите filter=lfs diff=lfs merge=lfs записи в свои .gitattributes, которые соответствуют уже зафиксированным файлам. Если вы хотите убедиться, что они конвертируются одновременно, используйте git rm --cached . и git add -A, чтобы переключить их на указатели LFS. (Конечно, если вы находитесь в чистом рабочем каталоге.) Если вы забудете преобразовать их, проблема может проявиться намного позже. Я не уверен, когда именно - возможно, когда их как-то коснутся.   -  person Tilman Vogel    schedule 08.07.2020


Ответы (17)


Как и Трэвис Хитер, упомянутый в его ответе, попробуйте следующую последовательность команд:

git lfs uninstall
git reset --hard
git lfs install
git lfs pull

В случае, если это не сработает (потому что это не сработало для меня), может сработать следующий хак:

git rm --cached -r .
git reset --hard
git rm .gitattributes
git reset .
git checkout .

Это сработало для меня!

person AKA    schedule 21.02.2019
comment
После борьбы с этим в разных ветках и выполнения таких вещей, как создание временных веток и передача им проблемного файла, я все же обнаружил, что у меня осталась одна ветка с застрявшим файлом ресурсов Unity. Этот метод сработал блестяще. - person Vixxd; 16.03.2019
comment
Мне нужно было выполнить слияние с другой веткой, но я не мог избавиться от этих файлов, не являющихся указателями. Сводит меня с ума ... Итак, я сделал git lfs uninstall, git reset hard <commit>, git merge <branch>, git lfs install и git lfs pull. Ну наконец то :). Спасибо. - person Spiralis; 06.05.2019
comment
Упс, мой предыдущий комментарий должен был сказать _1 _... Невозможно редактировать в Stackoverflow через некоторое время, вздох ... - person Spiralis; 07.05.2019
comment
Это сработало для меня, но мне пришлось добавить несколько интервалов между командами, чтобы он мог работать как сценарий bash, см. Мой код ниже. - person Pellet; 01.09.2020
comment
Работал для меня, НО на окнах, приходилось использовать PowerShell, а не git bash - person Avi Turner; 28.11.2020
comment
в чем разница между git reset. и git reset --hard выше? это git reset. просто сброс со смешанным по умолчанию вместо жесткого сброса выше? - person James Street; 21.01.2021
comment
У меня это не работает. git reset --hard, 2-й шаг на любом пути, не выполняется с тем же сообщением, что и спрашивающий, поэтому я не могу пройти этот шаг. - person gman; 29.01.2021

У меня была эта точная ошибка с некоторыми файлами, хранящимися с помощью git-LFS и решил это так же, как я решил индексирование borked, вызванное линизацией.

Очистите кеш и выполните полный сброс:

git rm --cached -r .
git reset --hard

Для меня это было значительно быстрее, чем новый клон, из-за огромных файлов git-LFS в моем репо.

person Rian Sanderson    schedule 01.08.2018
comment
Это не сработало для меня, но второй блок кода ответа AnsarAdimu сработал. Не пробовали первый блок кода своего ответа, потому что удаление git lfs показалось слишком сложным. - person mic; 08.05.2020

Начиная с git lfs 2.5.0, доступна новая команда, которая упрощает эту задачу (docs):

git lfs migrate import --no-rewrite "broken file.jpg" "another broken file.png" ...

Это «переносит» файлы в git lfs, которые должны находиться в lfs согласно .gitattributes, но их нет в данный момент (что является причиной вашего сообщения об ошибке).

--no-rewrite не позволяет git применять это к более старым коммитам, вместо этого он создает одну новую фиксацию.

Используйте -m "commitmessage", чтобы установить сообщение о фиксации для этой фиксации.

person karyon    schedule 06.09.2019
comment
Это решение сработало для меня. Первоначально я нашел его из этого сообщения в блоге: tech-notes.maxmasnick.com/ - person BillFienberg; 26.11.2019
comment
no-rewrite означает ли, что в вашей истории git все еще может быть несколько бинарных версий, а не только указатели? - person pooya13; 07.04.2021
comment
да. старые коммиты не будут изменены, поэтому все, что там содержится, остается в репо. если вы хотите стереть файл из всех коммитов, вам нужно будет переписать историю (исключение --no-rewrite, я полагаю, сделает это) - person karyon; 08.04.2021
comment
Это должен быть лучший ответ. Работает! - person Brian Craig; 22.07.2021

Проблема возникает из-за несоответствия между типами файлов, отмеченными как отслеживаемые git LFS в .gitattributes, и некоторыми совпадающими файлами, уже находящимися под обычным контролем версий, отличным от LFS.

Итак, самый простой обходной путь здесь - просто на мгновение удалить файл .gitattributes:

git rm .gitattributes
git reset .
git checkout .

После этого вы можете оформить заказ в любом другом филиале.

Еще один совет: при добавлении нового типа файла в git LFS предпочитайте не делать это вручную, изменяя .gitattributes, но, например, запустив:

git lfs track PATTERN

где ШАБЛОН - это шаблон для сопоставления файлов, например *.so

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

person Jordan    schedule 31.03.2020
comment
Я могу подтвердить, что это почти всегда работает с Git 2.18.0, 2.26.2 и 2.27.0. Если это не сработает с первой попытки, удалите файлы, вызывающие нарушение, и снова выполните указанные выше команды. - person keremispirli; 09.07.2020

Это может произойти, когда вы выполняете проверку, содержащую файлы, которые должны были отслеживаться LFS, как указано в .gitattributes, но каким-то образом они были зафиксированы напрямую. Скорее всего, у вас есть другая программа, управляющая вашим репозиторием, такая как git GUI или IDE.

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

Чтобы действительно решить эту проблему, убедитесь, что вы зафиксировали файлы как указатели LFS. Это должно быть так же просто, как использовать git add. Перед фиксацией проверьте свою работу с помощью git lfs status. git lfs ls-files покажет, какими файлами управляет LFS.

git lfs status вводит в заблуждение, поскольку он читает Git LFS objects to be committed, когда действительно перечисляет все изменения. Файлы, которые вы ожидаете отслеживать с помощью LFS, должны читать что-то вроде (LFS: c9e4f4a) или (Git: c9e4f4a -> LFS: c9e4f4a), а не (Git: c9e4f4a).

В качестве примера я обнаружил, что это проблема при добавлении ресурсов изображения через Xcode 9.2, где я добавил «CalendarChecked.png», который он добавил автоматически:

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png

$ git lfs status

Git LFS objects to be committed:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (Git: c9e4f4a)

Git LFS objects not staged for commit:

    Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (File: c9e4f4a)

$ git add Example/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png`
$ git lfs status

Git LFS objects to be committed:

    Empty/Empty/Assets.xcassets/CalendarChecked.imageset/CalendarChecked.png (LFS: c9e4f4a)

Git LFS objects not staged for commit:

$
person slythfox    schedule 29.12.2017

Ни одно из этих решений не помогло мне, но я собрал по кусочкам несколько источников, чтобы наконец все это исправить.

  1. Отправьте любые изменения, которые вы не хотите потерять

    Если можете ... Если нет или если вас не волнуют ваши изменения, продолжайте.

  2. Остановить все

    SourceTree, любые серверы, файловые обозреватели и браузеры. Иногда этот материал не работает, если он используется где-то еще. Если сомневаетесь, прекратите - с этим лучше переборщить.

    Кроме того, войдите в диспетчер задач, принудительно завершите все bash.exe процессы. Git Bash имеет тенденцию держать файлы открытыми после закрытия окна.

  3. Откройте командное окно (или терминал)

    cd в ваше местное репо.

  4. Удалить lfs

    > git lfs uninstall

    Тогда он скажет что-то вроде:

    Hooks for this repository have been removed.
    Global Git LFS configuration has been removed.
    
  5. Сброс

    > git reset --hard

    Вероятно, будет много вывода ...

  6. Переустановите lfs

    > git lfs install

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

  7. Потяните с lfs

    > git lfs pull

    Надеюсь, использование lfs перезапишет заблокированные файлы.

    Некоторые из моих источников сказали, что на данный момент их репо снова работает, но не я лично. Вы можете открыть SourceTree или что-то еще, чтобы проверить, если хотите, но вам, возможно, придется начать сверху, если это не сработает.

  8. Перенести

    Основная проблема здесь в том, что lfs вместо загрузки больших файлов, таких как аудио, видео, изображения - размером более 1 МБ - он просто указывает на них на сервере. Это полезно, если у вас есть куча больших файлов, вы не выгружаете все это. Таким образом, ваше местное репо меньше и шустрее. Однако в силу обстоятельств, в которых я не уверен, кажется возможным повредить указатели. Я уверен, что это проблема, о которой специалисты по lfs знают и над ней работают, но пока мы должны решить ее сами.

    На данный момент мы уже сделали

    • uninstall lfs
    • удалить все
    • переустановить lfs
    • тянуть все

    Итак, теперь у нас есть все эти вещи в нашей папке, которые являются либо файлами, либо указателями на файлы, и lfs необходимо выяснить, должны ли какие-либо файлы быть указателями и наоборот. И, надеюсь, выполнив описанные выше шаги, мы удалили поврежденные указатели. Итак, мы собираемся выполнить migrate, чтобы запустить процедуру, которая просматривает файлы в репо, и если они больше 1 МБ, lfs заменит их указателем.

    > git lfs migrate

  9. Еще ошибки

    Вот момент, когда другие остановились и сказали, что снова работают, но не я. У меня ошибка:

    Ошибка в git rev-list ... статус выхода 128 фатальный: неправильная версия '..._ 17_'

    @guneyozsan на странице справки github, опубликовал это последний кусок головоломки, хотя это не решило его проблемы.

    > git lfs migrate info --include-ref=v1.0.0

    Обратите внимание, что версия соответствует версии с ошибкой - v1.0.0. Вам нужно будет заменить v1.0.0 той версией, которая указана в вашей ошибке.

    Я не нашел источника, почему возникает эта ошибка, но я предполагаю, что номер версии lfs, сгенерированный migrate в вашем локальном репо, не соответствует исходной версии. Для меня все это началось, когда SourceTree разбился во время push, и я принудительно перезагрузил машину, и когда это происходит, lfs не знает, как с этим справиться, поэтому он просто застревает в этом цикле, где пытается обновить, но он не может прочитать поврежденные данные. Отсюда и длительный поиск неисправностей.

  10. Спрятать и вытащить

Когда вы откроете SourceTree, вы, вероятно, увидите, что он хочет вернуть все ваши файлы. Не делай этого. Спрятать, а затем вытащить.

И бум, мы надеемся, что ужас закончился. Если нет, то эта страница центра git или этот может вам больше помочь, но у меня это сработало.

person Travis Heeter    schedule 16.01.2019
comment
git lfs migrate спасал жизнь. Спасибо! - person kakyo; 02.07.2021

Убедитесь, что у вас установлена ​​git lfs версия 2.5 или выше (загрузите здесь).

Убедитесь, что вы используете git lfs версию, которую вы скачали (2.7.7 для меня):

>git lfs version
git-lfs/2.7.2

Бегать:

git lfs migrate import --fixup --everything

Вытяните свою ветку и исправьте любые конфликты слияния.

Найдено в этом комментарии github.

person Felix    schedule 14.05.2019
comment
Это правильный ответ, все остальное у меня не получилось. - person Philipp Ludwig; 12.03.2020

Одна из возможных причин этой ошибки - из-за изменений .gitattributes, связанных с git LFS, которые влияют на уже добавленные файлы в репо.

(Я не уверен в точных шагах воспроизведения, но проблема, похоже, возникла, когда я коснулся файла, на который недавно повлияли .gitattributes, который ранее был зафиксирован как не-LFS файл, который теперь должен быть файлом LFS. Проблема, казалось, усугублялась переключением ветвей или, по крайней мере, делала невозможным переключение ветвей, пока проблема не была решена.)

В этом случае я выполнил следующие шаги: чтобы эта ошибка не повторялась повторно.


  1. Исправьте проблему для ветки, в которой вы находитесь, следуя одному из других ответов здесь (например, чтобы очистить кеш и выполнить сброс. Я нашел ответ BheeMa, чтобы быть эффективным.)
  2. Перейдите в свою основную ветку и убедитесь, что нечего фиксировать с помощью git status
  3. Заставить git перепроверить и "повторно применить" изменения атрибутов git

Из ответа Рататы Тата в Как чтобы изменения в .gitattributes вступили в силу)

 git rm --cached -r .
 git add -A

Предупреждение: на шаге 2 убедитесь, что фиксировать нечего, так как указанные выше шаги добавят все файлы, для которых ранее не было версий

  1. Проверьте результаты с помощью git status (он должен был изменить только соответствующие файлы, чтобы они стали указателями LFS, т. Е. Файлы, которые потенциально могут вызвать ошибку «обнаруженные файлы, которые должны были быть указателями») и зафиксировать изменения.
  2. (При желании объедините / переустановите это исправление для всех других веток, если это возможно. В противном случае эта ошибка может появиться снова при переключении на эти ветки. Обратите внимание, что может потребоваться повторить первоначальное исправление для каждой ветки в соответствии с шагом 1, чтобы быть в безопасности. , хотя можно было бы просто зафиксировать затронутые файлы.)
person sonny    schedule 15.08.2019

Это просто еще раз показывает, что такое куча собачьих **** GIT-LFS.

Вы можете попасть в такую ​​ситуацию, если:

  1. Файл содержится в common-base-branch, а не в LFS
  2. В ветке lfs-branch на основе common-base-branch файл был перемещен в LFS
  3. В другой ветке non-lfs-branch, также основанной на common-base-branch, файл был изменен.

Или альтернативно:

  1. Этот файл НЕ содержится в common-base-branch
  2. В ветке lfs-branch на основе common-base-branch файл добавлен в LFS
  3. В другой ветке non-lfs-branch, также основанной на common-base-branch, файл был добавлен (но не в LFS.

В обоих случаях, когда вы пытаетесь объединить non-lfs-branch в lfs-branch, вы получаете такую ​​ошибку.

Вы можете спросить, почему это вообще должно происходить, но ответ заключается в том, что многие программы разрабатываются более чем одним человеком (именно поэтому у вас в первую очередь есть системы контроля версий, такие как GIT), а люди этого не делают. t всегда общаются друг с другом, или LFS вводится позже в истории проекта в ветке функций, в то время как нормальная разработка все еще продолжается в других ветвях.

Это законная ситуация конфликта слияния, а не ошибка или поврежденный рабочий каталог или что-то еще (как предполагают некоторые из других ответов). GIT-LFS просто плохо справляется с этим.

Что вы хотите сделать сейчас, так это убедиться, что правильная версия конфликтующих файлов попадает в GIT-LFS, поэтому вы можете выбрать ответ на этот вопрос, который делает именно это ... (TODO: Вставьте ссылку хотя бы на один ответ, который работает)

person Florian Winter    schedule 31.03.2021

Следующий процесс добавит фиксацию, которая заменяет все двоичные файлы, которые должны быть указателями lfs, указателями lfs.

  1. Полностью очистите рабочую копию. Вместе с приведенным ниже принудительным добавлением это предотвращает добавление или удаление любых файлов из-за шаблонов .gitignore.

    git clean -dfx
    git reset --hard
    git checkout -- .
    
  2. Добавьте удаление всего в область подготовки. Рабочую копию трогать не будем.

    git rm --cached -r .
    
  3. Снова прочитал все файлы из рабочей копии. Это в основном отменит предыдущую команду, но приведет к переоценке фильтров lfs. Используйте -f, чтобы игнорировать .gitignore. Все имеющиеся файлы были ранее зарегистрированы и должны быть добавлены снова.

    git add -f .
    
  4. Промежуточная область теперь должна содержать только двоичные файлы, которые ранее вызывали ошибку «должны были быть указатели».

    git commit -m "moved files to lfs"
    
person Archy    schedule 15.07.2019

Если вы просто хотите уйти от этой плохой фиксации, вы можете вернуться к мастеру,

git reset --soft origin/master
git reset --hard

Тогда вы свободны от 7 неприятных файлов, не относящихся к LFS :-)

person Junji Shimagaki    schedule 14.03.2020

Вот проблема, с которой я столкнулся:

Допустим, вы создали ветку и каким-то образом зафиксировали файлы как файлы, отличные от LFS. Итак, вы попытались исправить это, позже зафиксировав версию файлов LFS в той же ветке. Однако теперь вы не можете перебазировать или сжать, потому что вы продолжите сталкиваться с этими «файлами, которые должны были быть указателями, но не были» ошибкой в ​​середине перебазирования.

Решите, используя git reset --soft: https://stackoverflow.com/a/5201642/2516916

person Gillespie    schedule 08.05.2020

Когда очевидно, что ошибка возникает из ниоткуда, мы в нашей команде делаем вот что:

  1. Отключите lfs для этого конкретного типа файла (изменив .gitattributes или через меню SourceTree)

  2. Изменение исчезнет, ​​и вместо этого вы увидите изменение в .gitattributes.

  3. Устраните проблему:

    3.1 Одно из решений - выполнить git reset --hard. Другой способ - отменить изменения. Иногда файл не появляется снова.

    3.2.1 Если предыдущее решение не работает, повторите шаги 1 и 2. Затем убедитесь, что эта ветка, в которой вы находитесь (A), уже зафиксировала и отправила все, кроме этих надоедливых файлов. Затем зафиксируйте свое изменение, но не продвигайте его.

    3.2.2: Перейти в другую ветку (B)

    3.2.3: Удалите ту локальную ветвь (A), в которой вы выполнили фиксацию в .gitattributes, принудительно удалив, даже если он говорит, что есть фиксация, которая не была отправлена. Он забудет этот коммит (впоследствии его можно удалить через GC или что-то еще, но это не имеет большого значения, если файл с ошибкой небольшой)

    3.2.4: Снова проверьте ветку A. Он загрузит предыдущий статус репозитория без надоедливых файлов, и настройки LFS будут настроены правильно.

Это всегда работает!

person Darkgaze    schedule 27.06.2019

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

git rm --cached -r .
sleep 1
git reset --hard
sleep 1
git rm .gitattributes
sleep 1
git reset .
sleep 1
git checkout .
person Pellet    schedule 01.09.2020

ни одна из вышеперечисленных команд у меня не сработала, я нашел ответ здесь

git status -s | cut -c 4- | xargs git update-index --assume-unchanged
rm .git/index && git reset
person ladhari    schedule 09.12.2020
comment
Спасибо! Ни один из других ответов не сработал для меня, кроме этого. - person Dustin Keib; 02.03.2021
comment
Почему это может работать, а может и не работать, вы можете объяснить, что это делает (ссылка ведет на веб-сайт на японском языке). Правильное ли это решение может зависеть от причины проблемы. - person Florian Winter; 31.03.2021
comment
@FlorianWinter причина проблемы описана в вопросе выше, еще одна причина, по которой возникает эта ошибка, заключается в том, что некоторые люди в команде не включили git-lfs, поэтому эта команда только что обновила индекс, и когда у вас много файлов для исправления , мы использовали эту команду: git status -s | cut -c 4- |, чтобы собрать все файлы, я просто написал ответ, который сработал для меня, чтобы помочь людям, которые столкнулись с такими же проблемами, как я - person ladhari; 01.04.2021

В моем случае это был один файл по правилам lfs (я предполагаю, что он был зарегистрирован без установленного lfs или чего-то еще).

Итак, я нашел его расширение в файле .gitattributes и прокомментировал эту строку как

#*.7z filter=lfs diff=lfs merge=lfs -text

сохранил этот .gitattributes, после чего git status не обнаружил проблем.

После этого я раскомментировал эту строку (удалил #), сохранил .gitattributes, и git status по-прежнему не показывает никаких проблем.

person Boltyk    schedule 25.05.2021

бегать

git add --renormalize .

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

person plucked    schedule 10.12.2020