Почему отображается сообщение "Не удалось обновить индекс Git"

Я использую Windows. При размещении файлов я получаю эту ошибку.

Updating the Git index failed. A rescan will be automatically started to resynchronize git-gui.

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

После большого количества чтений по проблеме CRLF / LF с кросс-платформой использования Git я более или менее понимаю, что происходит, и пытаюсь определить, какой параметр autocrlf лучше всего подходит для меня, но я не могу понять, почему Git говорит, что Не удалось обновить индекс. Насколько я понимаю, он преобразовал EOF, поэтому в чем проблема и почему он сообщает мне, что обновление индекса не удалось. Нужно ли мне что-то исправить (кроме выбора соответствующей настройки autocrlf) или я могу просто продолжить

Затем у меня есть два варианта «Продолжить» и «Индекс разблокировки», что они означают и как лучше всего действовать.


person byronyasgur    schedule 13.05.2012    source источник
comment
Возможный дубликат LF будет заменен на CRLF в git - что это такое и насколько это важно?   -  person Stevoisiak    schedule 08.11.2017


Ответы (3)


git config --global core.autocrlf false

Всегда был моей рекомендацией (см. "Git 1.6.4 beta для Windows (msysgit) - завершение строки Unix или DOS").

Однако в вашем случае вы можете «Продолжить», но это предупреждение указывает на то, что преобразование определенных файлов может быть необратимым:

core.safecrlf

Если true, заставляет git проверять, является ли преобразование CRLF обратимым, когда активно преобразование конца строки. Git проверит, изменяет ли команда файл в рабочем дереве прямо или косвенно. Например, фиксация файла с последующим извлечением того же файла должна привести к исходному файлу в рабочем дереве. Если это не так для текущего значения core.autocrlf, git отклонит файл.
Для переменной можно установить значение «warn», и в этом случае git только предупредит о необратимом преобразовании, но продолжит операцию.

Если вы не хотите видеть это предупреждение, как описано в этой теме, вы можете установить core.safecrlf в false.

Вы также можете спрятать свои файлы через меню инструментов git gui и добавить некоторые параметры к этим инструментам, например, с помощью этого git config file.
Интересно то, что для каждого инструмента вы можете добавить:

guitool.<name>.norescan

Не выполняйте повторную проверку рабочего каталога на наличие изменений после завершения работы инструмента.


Не могли бы вы рассказать немного об индексе разблокировки

вы можете увидеть это сообщение в index.tcl git -gui script: он удаляет файл index.lock, созданный git-gui при манипулировании индексом.
Вы можете увидеть больше на страница документации по API lockfile:

Взаимное исключение.
Когда мы записываем новый индексный файл, сначала мы создаем новый файл $GIT_DIR/index.lock, записываем в него новое содержимое и переименовываем его в конечный пункт назначения $GIT_DIR/index.
Мы попробуйте создать $GIT_DIR/index.lock файл с O_EXCL, чтобы мы могли заметить и потерпеть неудачу, когда кто-то уже пытается обновить индексный файл.

person VonC    schedule 13.05.2012
comment
Спасибо за исчерпывающий ответ, но вы пару раз упомянули предупреждение, но это именно моя проблема, это не означает, что это предупреждение, а ошибка .Updating the Git index failed ... или я неправильно это понимаю? - person byronyasgur; 13.05.2012
comment
@byronyasgur поток, который я упоминаю в ответе, называет это сообщение предупреждением, я полагаю, потому что он не завершает работу полностью командой git. Он только прерывает его, спрашивая вас о выборе (если вы не укажете norescan или core.safecrlf на false) - person VonC; 14.05.2012
comment
Я начинаю понимать. Можете ли вы объяснить разницу между этими двумя вариантами или указать мне на ресурс, который делает, я не могу понять, что означает «Разблокировать и продолжить» в этом контексте. - person byronyasgur; 14.05.2012
comment
@byronyasgur kerneltrap.org/mailarchive/git/2008/8/12/2901814 Я думаю, что если вы не продолжите, это означает, что вы не хотите, чтобы преобразование EOL продолжалось, а это означает, что Git должен снять блокировку с файлов в индексе, который он должен был обновить. - person VonC; 14.05.2012
comment
Я думаю, что ложь - это настройка для меня в любом случае, поэтому AFAICS для меня это становится спорным. - person byronyasgur; 14.05.2012
comment
@byronyasgur, ладно, так проще звучит. - person VonC; 14.05.2012
comment
Не могли бы вы подробнее рассказать о индексе разблокировки, чтобы этот исчерпывающий ответ был полным? - person Mr_and_Mrs_D; 11.11.2012
comment
@Mr_and_Mrs_D Я отредактировал свой ответ, чтобы подробно описать шаг разблокировки индекса - person VonC; 12.11.2012
comment
Грр - кажется, Unlock Index делает именно то, что делает Continue - $ # @ $ ^ - person Mr_and_Mrs_D; 15.11.2012

Я также столкнулся с этим, даже несмотря на то, что мой core.autocrlf параметр уже false, а core.safecrlf не установлен. Я подозреваю, что виноват параметр конфигурации diff.astextplain.textconv.

Когда я запустил git config --list, на выходе была показана следующая строка:

diff.astextplain.textconv=astextplain

Я не думаю, что этот параметр на самом деле связан с предупреждением / ошибкой, но он вдохновил меня изучить преобразование текста, которое может быть выполнено. После небольшого изучения в Интернете и в моем репо я обнаружил следующую строку в файле .gitattributes моего репо:

* text=auto

[Я, вероятно, получил файл .gitattributes с GitHub.]

Учитывая, что в нем не прокомментирована только вышеприведенная строка и, кроме того, обработка «автоматических» преобразований с окончанием строки всегда была головной болью, я решил удалить этот файл из своего репо. После этого при постановке тех же файлов мне больше не выводилось предупреждение / ошибка «Ошибка обновления индекса Git».

person Kenny Evitt    schedule 26.09.2016

TL; DR: это предупреждение означает, что git может вернуть вам текстовый файл в стиле Windows, несмотря на то, что вы проверили текстовый файл в стиле UNIX.

UNIX и Windows различаются тем, как они сохраняют разрывы строк в текстовых файлах. В Википедии есть список разрывов строк в разных ОС

Полученное предупреждение можно воспроизвести, если вы выполните следующие действия в Windows:

  • Создайте репозиторий git в пустом каталоге
  • Создайте фиксацию, представляющую начальное пустое состояние репо:

    git commit --allow-empty -m "initial commit"
    
  • используйте git config core.autocrlf и git config core.safecrlf, чтобы убедиться, что для autocrlf установлено значение true, а safecrlf не установлено (нет вывода). Если это не так, используйте следующие команды, чтобы установить их

    git config core.autocrlf true
    git config --unset core.safecrlf
    
  • Используйте Notepad ++ для записи текстового файла с именем text.txt в формате UNIX. Напишите файл, в котором есть хотя бы один разрыв строки. Вот как вы выбираете окончания строк UNIX:  Блокнот ++ с меню Правка - Открыто преобразование EOL

  • # P7 #
    # P8 #
  • Зафиксируйте текстовый файл: `git commit -m" добавить файл с окончаниями UNIX "

  • Теперь посмотрите, как выглядит файл, если вы посмотрите его на дереве. Во-первых, проверьте версию до того, как вы создали файл (вернитесь на 1 коммит). Файл text.txt исчезает из рабочего каталога:

    git checkout ~1
    
  • Теперь восстановите версию после создания файла

    git checkout master
    

Файл text.txt восстановлен. Но откройте его в Notepad ++ и проверьте формат окончания строки в нижней строке состояния Notepad ++:

Восстановленный файл с окончанием CRLF в стиле Windows

Файл, который вы извлекли, имеет окончания строки в стиле Windows, но файл, который вы зафиксировали, имел окончания в стиле UNIX! Предупреждение о том, о чем идет речь: Параметры core.autocrlf=true вместе с core.safecrlf=<unset> означают, что файлы, которые вы восстанавливаете из дерева, могут отличаться от файлов, которые вы отметили, поскольку у них могут быть разные окончания.

person akraf    schedule 25.09.2018