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