Почему после редкого извлечения вызывается `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() называется.

Другие вопросы по тегам