В чем разница между "--tree-filter" и "--index-filter" в "git filter-branch"?
Я изучаю "дерево" и "индекс" из этой статьи: Изучение Git Internals на примере
но когда дело доходит до команды "git filter-branch", я не знаю, в чем разница между "--tree-filter" и "--index-filter".
1 ответ
Короткая версия такова, что --tree-filter
извлекает каждый коммит во временный каталог, запускает команду фильтра и создает новый коммит из того, что сейчас находится во временном каталоге; в то время как --index-filter
копирует каждый коммит в индекс, запускает команду фильтра и создает новый коммит из того, что сейчас находится в индексе.
Копирование коммита в индекс намного быстрее, чем проверка коммита. Сборка коммита из индекса происходит быстрее, чем коммит из каталога. В результате использование фильтра индекса намного быстрее, чем использование фильтра дерева. Это не так просто для сценария, хотя.
1 Точная разница в скорости зависит от вашего временного каталога: файловая система в памяти быстрее, чем файловая система на твердотельном накопителе, которая быстрее, чем на вращающемся носителе, поэтому вы получаете больше, если используете вращающийся носитель, чем если бы вы может указать древовидный фильтр на файловую систему в памяти. Но даже тогда индексный фильтр все еще быстрее.
На реальных дисках я видел коэффициент около 100 или около того (следовательно, индексный фильтр, который занимает 2 минуты, переводится в древовидный фильтр, который занимает более 3 часов).