Вопрос по git, windows – Почему отображается сообщение «Ошибка обновления индекса Git»

44

Я использую 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) или я могу просто продолжить

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

Возможная копияLF будет заменен на CRLF в git - что это и важно? Steven M. Vascellaro

Ваш Ответ

3   ответа
46
git config --global core.autocrlf false

Git 1.6.4 beta для Windows (msysgit) - завершение строки Unix или DOS ").

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

core.safecrlf

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

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

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

guitool.<name>.norescan

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

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

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

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

Спасибо за исчерпывающий ответ, но вы упомянули предупреждение пару раз, но это точно моя проблема, это не значит, что это предупреждение, а ошибка.Updating the Git index failed ... или я неверно истолковал это? byronyasgur
@ byronyasgur тема, которую я упоминаю в ответе, относится к этому сообщению как к «предупреждению», я полагаю, потому что это непрова полностью команда git. Он только прерывает его, запрашивая у вас выбор (если вы не укажете "@&quonorescan" илиcore.safecrlf вfalse) VonC
Я начинаю понимать. Можете ли вы объяснить разницу между этими двумя вариантами или указать мне на ресурс, который, я думаю, не может понять, что подразумевается под «разблокировать и продолжить» в этом контексте. byronyasgur
@ byronyasgur Kerneltrap.org / mailarchive / мерзавец / 2008/8/12/2901814 Я думаю, что если вы не "Продолжить", это означает, что вы не хотите, чтобы преобразование EOL продолжалось, а это означает, что Git должен снять блокировку с файлов в индексе, который предполагалось обновить. VonC
Я думаю, что в любом случае для меня это ложь, поэтому AFAICS для меня становится спорным. byronyasgur
2

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

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

diff.astextplain.textconv=astextplain

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

* text=auto

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

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

0

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

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

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

Создайте git-репозиторий в пустой директории

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

git commit --allow-empty -m "initial commit"

usegit 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:

git add text.txt. Вы получите предупреждение

warning: LF будет заменен на CRLF в text.txt.
Файл будет иметь исходные окончания строк в вашем рабочем каталоге.

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

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

git checkout ~1

Теперь восстановите версию после того, как вы создали файл

git checkout master

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

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

Похожие вопросы