Почему после редкого извлечения вызывается `git read-tree`?
В соответствии с Подкаталогом Checkouts с git sparse-checkout одним звонком git read-tree -mu HEAD
после настройки разреженной проверки в случае уже существующего хранилища, то есть:
# Enable sparse-checkout:
git config core.sparsecheckout true
# Configure sparse-checkout
echo some/dir/ >> .git/info/sparse-checkout
echo another/sub/tree >> .git/info/sparse-checkout
# Update your working tree:
git read-tree -mu HEAD
- Можете ли вы объяснить,
read-tree
шаг поподробнее? - Как это работает?
- Что здесь происходит?
- Почему один использует
read-tree
и нет, скажем так,checkout
? - Почему один использует
-mu
(почему это слияние, а что сливается)?
-m
Perform a merge, not just a read. The command will refuse to run if your index file has unmerged entries, indicating that you have not finished previous merge you started.
-u
After a successful merge, update the files in the work tree with the result of the merge.
0 ответов
В Git 2.25 (первый квартал 2020 г.) Управление редко проверяемым рабочим деревом получило специальную команду "sparse-checkout".
Он вводит режим конуса (который я подробно описываю в разделе " Разреженная проверка Git с исключением "), который сделаетsparse-checkout
должен быстрее.
Но он также косвенно описывает, почему git read-tree -mu HEAD
используют (или, с новым режимом "конуса", был использован).
См. Коммит e6152e3 (21 ноября 2019 г.) Джеффа Хостетлера (Jeff-Hostetler
).
См. Коммит 761e3d2 (20 декабря 2019 г.) Эд Масте (emaste
).
См фиксации 190a65f (13 дек 2019), а также совершать cff4e91, совершают 416adc8, совершают f75a69f, совершают fb10ca5, совершают 99dfa6f, совершают e091228, совершают e9de487, совершают 4dcd4de, совершают eb42fec, совершают af09ce2, совершают 96cc8ab, совершают 879321e, совершают 72918c1, совершают 7bffca9, фиксация f6039a9, фиксация d89f09c, фиксация bab3c35, фиксация 94c0956(21 ноя 2019) Деррик Столи (derrickstolee
).
(Слияние Junio C Hamano -gitster
- в коммите bd72a08, 25 декабря 2019 г.)
sparse-checkout
: обновить рабочий каталог в процессеПодписано: Деррик Столи
Используемая встроенная функция sparse-checkout '
git read-tree -mu HEAD
'для обновления битов skip-worktree в индексе и для обновления рабочего каталога.
Этот дополнительный процесс слишком сложен и подвержен неудачам. Это также требует, чтобы мы записали наши изменения в файл разреженной проверки, прежде чем пытаться обновить индекс.
Удалите этот дополнительный вызов процесса, создав прямой вызов
unpack_trees()
таким же образом 'git read-tree -mu HEAD
'делает.
Кроме того, предоставьте список шаблонов в памяти, чтобы мы могли избежать чтения из файла разреженной проверки. Это позволяет нам протестировать предлагаемое изменение файла перед записью в него.
Более ранняя версия этого патча включала ошибку, когда '
set
'не удалось выполнить команду из-за ошибки "Редкая проверка не оставляет записи в рабочем каталоге".
Это не приведет к откатуindex.lock
файл, поэтому воспроизведение старой спецификации разреженной проверки не удастся. Тест в t1091 теперь охватывает этот сценарий.
А с Git 2.27 (второй квартал 2020 г.) "sparse-checkout
"знает, как подать заявку повторно:
См совершать 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 г.)
sparse-checkout
: предоставить новую подкоманду повторного примененияРецензент: Деррик Столи
Подписано: Элайджа Ньюрен
Если такие команды, как слияние или перебазирование, материализуют файлы как часть своей работы, или предыдущая команда sparse-checkout не смогла обновить отдельные файлы из-за грязных изменений, пользователи могут захотеть, чтобы команда просто "повторно применила" правила разреженности.
Предоставьте один.
обновленgit sparse-checkout
страница руководства теперь включает:
reapply
:
Повторно примените правила шаблона разреженности к путям в рабочем дереве.
Команды вроде
merge
илиrebase
могут материализовать пути для выполнения своей работы (например, чтобы показать вам конфликт), а другие команды разреженной проверки могут не разложить отдельный файл (например, из-за неустановленных изменений или конфликтов).
В таких случаях имеет смысл запустить
git sparse-checkout reapply
позже после очистки затронутых путей (например, разрешения конфликтов, отмены или фиксации изменений и т. д.).
Но с Git 2.27 он не будет повторно применять / обновлять себя, используя git read-tree
больше:
См совершать 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
: добавить новыйupdate_sparsity()
функцияРецензент: Деррик Столи
Подписано: Элайджа Ньюрен
Раньше единственный способ обновить
SKIP_WORKTREE
биты для разных путей вызывалиgit read-tree -mu HEAD
или вызывая тот же код, что и этот кодовый путь.
Однако при этом возникал ряд проблем, если индекс или рабочий каталог не были чистыми.
Сначала рассмотрим случай:
Flipping SKIP_WORKTREE -> !SKIP_WORKTREE (materializing files)
Если рабочее дерево было чистым, это было нормально, но если были файлы, каталоги, символические ссылки или что-то еще, что уже присутствовало на заданном пути, операция прервалась бы с ошибкой.
Давайте обозначим этот случай для дальнейшего обсуждения:
- A) На пути есть неизведанный путь
Теперь рассмотрим противоположный случай:
Flipping !SKIP_WORKTREE -> SKIP_WORKTREE (removing files)
Если бы индекс и рабочее дерево были чистыми, это нормально, но если бы были какие-то нечистые пути, мы столкнулись бы с проблемами.
Следует рассмотреть три разных случая:
- Б) Путь не объединен
- В) В пути есть неустановленные изменения
- D) Путь имеет поэтапные изменения (отличается от HEAD)
Если какой-либо путь попадет в случай B или C, вся операция будет прервана с ошибкой.
С участием
sparse-checkout
, вся операция будет прервана и для случая D, но для его предшественника с использованиемgit read-tree -mu HEAD
напрямую, любые пути, которые попали в случай D, будут удалены из рабочей копии, а запись индекса для этого пути будет сброшена, чтобы соответствоватьHEAD
- что выглядит и ощущается как потеря данных для пользователей (лишь немногие даже осведомлены, чтобы спросить, можно ли их восстановить, и даже в этом случае требуется пройти через незакрепленные объекты, пытаясь сопоставить нужные).
Отказ от удаления файлов с несохраненными пользовательскими изменениями - это хорошо, но отказ от работы с любыми другими путями очень проблематичен для пользователей.
Если пользователь находится в процессе перебазирования или внес изменения в файлы, которые вносят больше зависимостей, то для того, чтобы их сборка работала, ему необходимо обновить разреженные пути.
Эта логика мешает им сделать это.
Иногда в ответ пользователь помещает файлы и повторяет попытку, безрезультатно с разреженной проверкой или к ужасу потери своих изменений, если они используют его предшественник
git read-tree -mu HEAD
.
Добавить новый
update_sparsity()
функция, которая не выдаст ошибку ни в одном из этих случаев, но в особых случаях ведет себя следующим образом:
- А) Оставьте файл в рабочей копии в покое, очистите
SKIP_WORKTREE
bit и вывести предупреждение (таким образом, оставив путь в состоянии, при котором статус будет сообщать, что файл был изменен, что кажется логичным).
- Б) НЕ помечайте этот путь как
SKIP_WORKTREE
, и оставьте его без объединения. - C) НЕ помечайте этот путь как
SKIP_WORKTREE
и распечатать предупреждение о грязном пути. - D) Отметьте путь как
SKIP_WORKTREE
, но не возвращайте версию, хранящуюся в индексе, для соответствияHEAD
; оставьте содержимое в покое.
Я пробовал другое поведение для A (оставьте
SKIP_WORKTREE
установлен бит), но обнаружил, что это очень удивительно и противоречит интуиции (например, пользователь видит, что он присутствует вместе со всеми другими файлами в этом каталоге, пытается обработать его, ноgit add
игнорирует это, посколькуSKIP_WORKTREE
бит установлен).
A&C кажется мне оптимальным поведением.
B тоже может быть, хотя мне интересно, будет ли печать предупреждения улучшением.
Некоторых сначала может немного удивить D, но, учитывая, что он правильно работает с
git commit
и дажеgit commit -a
(git add
игнорирует отмеченные записиSKIP_WORKTREE
и поэтому не удаляет их, иcommit -a
похоже), мне это кажется логичным.
И все еще с GIt 2.27 (второй квартал 2020 г.):
См. Commit 6c34239 (14 мая 2020 г.) Элайджа Ньюрен (newren
).
(Слияние Junio C Hamano -gitster
- в коммите fde4622, 20 мая 2020 г.)
unpack-trees
: также разрешитьget_progress()
работать с другим индексомЗаметил: Джефф Хостетлер.
Подписал: Элайджа Ньюрен.
совершить b0a5a12a60 ("
unpack-trees
: позволятьcheck_updates()
для работы с другим индексом ", 2020-03-27, Git v2.27.0-rc0 - слияние, указанное в пакете № 5) разрешеноcheck_updates()
для работы с другим индексом, но он вызвалget_progress()
который был жестко запрограммирован для работы надo->result
так же, какcheck_updates()
был.
Обновите его, чтобы он также принял параметр индекса и
check_updates()
передайте этот параметр, чтобы оба работали с одним индексом.
Код стал более надежным с Git 2.29 (4 квартал 2020 г.):
См. Commit 55fe225, commit 1c89001, commit 9a53219 (17 августа 2020 г.) и commit f1de981, commit c514c62, commit 9101c8e, commit 8dc3156 (14 августа 2020 г.) Джефф Кинг (peff
).
(Слияние Junio C Hamano -gitster
- в коммите 0d9a8e3, 27 августа 2020 г.)
clear_pattern_list()
: очистить встроенные хэш-картыПодписано: Джефф Кинг.
Подпись: Деррик Столи.
Фиксировать 96cc8ab531 ("
sparse-checkout
: использовать хэш-карты для паттернов конусов ", 2019-11-21, Git v2.25.0-rc0 - merge) добавил несколько вспомогательных хэш-карт вpattern_list
struct, но они просочились, когдаclear_pattern_list()
называется.