Git sparse checkout error "Запись 'путь / к / файлу' не обновляется. Не удается обновить разреженную проверку"

Я только что сделал редкую проверку, следуя инструкциям ниже

git clone http://location/repo.git
# create .git/info/sparse-checkout file
git config --bool core.sparsecheckout true
git read-tree -mu HEAD

К сожалению, последний шаг завершается неудачно с сообщением об ошибке

Entry 'path/to/file' not update. Cannot update sparse checkout

Что странно, потому что (1) path/to/file Существует (2) процесс разреженной проверки успешно завершен на другом компьютере версии 1.7.1 (Centos 6). Текущий компьютер представляет собой коробку Centos 7 с установленной версией git 1.8.3.1. Выход из git config --list идентичен на обеих машинах.

2 ответа

Решение

Я по существу исправил проблему, удалив все файлы и повторив те же шаги. Было высказано предположение, что это может быть ошибка в git, или IMO, что-то вроде повреждения файла.

Ошибка возникает (для файлов, находящихся в рабочем дереве), если функция 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).

Во-первых, с Git 2.27 (второй квартал 2020 г.) после удаления файлов вы можете использовать git sparse-checkout reapply

Во-вторых, изменилось сообщение об ошибке (все еще с Git 2.27+):

См совершать 5644ca2, совершать 681c637, совершают ebb568b, совершает 22ab0b3, совершает 6271d77, совершает 1ac83f4, совершают cd002c1, совершает 4ee5d50, совершает f56f31a, совершает 7af7a25, совершает 30e89c1, совершает 3cc7c50, совершает b0a5a12, совершает 72064ee, совершает fa0bde4, совершает d61633a, совершить d7dc1e1, совершить 031ba55 (27 марта 2020 г.) Элайджа Ньюрен (newren).
(Слияние Junio ​​C Hamano -gitster- в коммите 48eee46, 29 апр 2020 г.)

unpack-trees: сделать сообщения о разреженных путях похожими на предупреждения

Рецензент: Деррик Столи
Подписано: Элайджа Ньюрен

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

Перефразируйте сообщения, чтобы они имели смысл в новом контексте.

Это уже не:

Cannot update sparse checkout

Но:

The following paths are not up to date
Другие вопросы по тегам