Ошибка возникает (для файлов, находящихся в рабочем дереве), если функция ie_match_stat
не соответствует статистической информации. Этот конкретный вызов ie_match_stat
передает CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE
, поскольку ie_match_stat
обычно подчиняется флагам записи кэша CE_VALID
или CE_SKIP_WORKTREE
, говоря: копия рабочего дерева актуальна , даже если она не. Код разреженного извлечения использует флаг skip-worktree (CE_SKIP_WORKTREE
), чтобы пометить файлы, которые не должны быть извлечены, чтобы остальная часть Git не жаловалась на их отсутствие.
Следовательно, странности здесь:
- Бит skip-worktree устанавливается для файла, который равен в рабочем дереве. Почему?
- Кэшированные данные индекса
stat
для этого файла не совпадают с lstat
результатами из этого файла. Почему?
Ответ на первый вопрос может быть следующим: , потому что пользователь установил его (используя git update-index
). Ответ на второй может быть: , потому что пользователь изменил файл . Так что они совсем не странные, они просто подразумевают, что файл не соответствует тому, что было создано при начальной проверке или операции git read-tree
. Если вы не заботитесь о потере содержимого файла, смело удаляйте его. Если вы заботитесь о содержимом, очистите бит skip-worktree (git update-index --no-skip-worktree
), после которого git diff
должен показать, что отличается.
В этой области могут быть некоторые ошибки, особенно в версиях Git, которые являются такими древними (Git 1.8.x - текущий Git - 2.22).