Почему "обновление индекса 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) или я могу просто продолжить
затем у меня есть два варианта продолжения и разблокировки индекса, что они означают и каков наилучший курс действий.
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
.
вы также можете спрятать свои файлы через меню tools gui git и добавить некоторые параметры в эти инструменты, например, this конфигурационный файл git.
Интерес заключается в том, что для каждого инструмента вы можете добавить:
guitool.<name>.norescan
не сканируйте рабочий каталог на наличие изменений после завершения выполнения инструмента.
не могли бы Вы уточнить немного по индексу разблокировки
вы можете увидеть это сообщение в index.tcl
скрипт Git-gui: он удаляет индекс.файл блокировки Git-gui создается при манипулировании индексом.
Вы можете увидеть больше на "файл API в разделе" Документация:
взаимоисключение.
Когда мы пишем новый индексный файл, сначала мы создаем новый файл$GIT_DIR/index.lock
, запишите в него новое содержимое и переименуйте его в окончательный пунктом$GIT_DIR/index
.
Мы пытаемся создать СO_EXCL
чтобы мы могли заметить и потерпеть неудачу, когда кто-то другой уже пытается обновить индексный файл.
Я также столкнулся с этим даже tho мой core.autocrlf
настройки уже false
и core.safecrlf
не установлено. Я подозреваю, что виновником является настройка конфигурации diff.astextplain.textconv
.
когда я подбежал git config --list
, на выходе была показана следующая строка:
diff.astextplain.textconv=astextplain
Я не думаю, что этот параметр на самом деле связан с предупреждением/ошибкой, но он вдохновил меня посмотреть на преобразование текста, которое может быть сделано. После небольшого спелеологического онлайн и в моем РЕПО я обнаружил следующую строку в моем РЕПО .gitattributes по:
* text=auto
[Я, вероятно, получил .gitattributes по файл из GitHub.]
учитывая, что только вышеуказанная строка не была прокомментирована в ней, и далее, что дело с "автомагическими" преобразованиями с окончанием строки имеет всегда была головная боль, я решил удалить этот файл из моего РЕПО. После этого постановка тех же файлов больше не запрашивала меня с предупреждением/ошибкой "обновление индекса Git не удалось".
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
использовать Блокнот++ написать текстовый файл с именем
text.txt
в формате UNIX. Написать файл, содержащий хотя бы одну строку ломать. Вот как вы выбираете окончание строки UNIX:-
git add text.txt
. Вы получаете предупреждениепредупреждение: LF будет заменен на CRLF в тексте.формат txt.
Файл будет иметь исходные окончания строк в вашем рабочем каталоге. зафиксировать текстовый файл: 'git commit-m" добавить файл с окончаниями UNIX"
-
теперь посмотрите, как выглядит файл например, если посмотреть с дерева. Во-первых, проверьте версию перед созданием файла (go 1 commit back). Файл
text.txt
исчезает из рабочего каталога:git checkout ~1
-
теперь восстановите версию после создания файла
git checkout master
файл text.txt
восстановлена. Но откройте его в Notepad++ и проверьте формат окончания строки в нижней строке состояния Notepad++:
файл, который вы проверили, имеет окончание строки в стиле Windows, но файл, который вы отправили, имел окончание файла в стиле UNIX! Вот о чем предупреждает сообщение:параметры core.autocrlf=true
вместе с core.safecrlf=<unset>
означает, что файлы, которые вы восстанавливаете из дерева, могут отличаться от файлов, которые вы зарегистрировали, потому что они могут иметь разные окончания файлов.