Как я могу возобновить переписывание истории git?

Я переписываю историю довольно большого репо, используя git filter-branch --tree-filter, и это занимает несколько часов. Я вижу, что git использует временный каталог для хранения своей промежуточной работы. Означает ли это, что можно возобновить переписывание, если оно было прервано? Если да, то как?

Изменить

Операция, которую я делаю, перемещает пару каталогов. В настоящее время они находятся в подкаталогах, но теперь мне нужно, чтобы они были в корне.

e.g.

dir1
- dir2
- dir3
- dir4

становится

dir1
- dir2
dir3
dir4

Конечно, моя структура каталогов намного сложнее, но это суть того, что я пытаюсь сделать.


person alnorth29    schedule 22.04.2013    source источник
comment
Из любопытства (не очень важно для вашего вопроса), можете ли вы описать, какую операцию вы делаете с --tree-filter? Удаление или изменение файлов?   -  person Roberto Tyley    schedule 23.04.2013


Ответы (2)


git filter-branch сам по себе не поддерживает шаблон использования приостановки/возобновления — хотя он записывает временные данные в папку .git-rewrite, фактической поддержки возобновления на основе содержимого этого каталога нет. Если вы запустите git filter-branch в репозитории, в котором ранее была прервана операция filter-branch, он либо попросит вас удалить эту временную папку, либо, с параметром --force, сделай сам.

Основная проблема заключается в том, что git-filter-branch медленно работает в больших репозиториях — если бы процесс был намного быстрее, не было бы никакой мотивации для попытки возобновления. Итак, у вас есть несколько вариантов:

Заставьте git-filter-branch работать немного быстрее...

  • использовать RAM-диск - git-filter-branch есть очень интенсивный ввод-вывод и будет работать быстрее, если ваш репозиторий находится в оперативной памяти.
  • используйте --index-filter, а не --tree-filter - он похож на фильтр дерева, но не проверяет дерево файлов, что делает его быстрее, но действительно требует, чтобы вы переписали изменения в файле с точки зрения команд git index.
  • используйте облачные вычисления и наймите машину с быстрой оперативной памятью и высокой тактовой частотой (не беспокойтесь о нескольких ядрах, если только ваши собственные команды не являются многопоточными, так как git-filter-branch сама по себе однопоточная)

...или используйте The BFG (намного быстрее)

BFG Repo-Cleaner — это более простая и быстрая альтернатива git-filter-branch. в 50–150 раз быстрее. Это превращает вашу работу, которая занимает несколько часов, в работу, которая занимает всего несколько минут.

Полное раскрытие: я автор BFG Repo-Cleaner.

person Roberto Tyley    schedule 22.04.2013
comment
Спасибо за указатели. Запуск виртуальной машины Linux с RAM-диском значительно ускорил работу. Я не смог использовать BFG Repo-Cleaner, так как операция, которую я выполняю, заключается в перемещении пары каталогов так, чтобы они находились в корневом каталоге, а не в подкаталоге. Насколько я могу судить, это также делает --index-filter сложным, поскольку git mv не работает только с индексом. - person alnorth29; 24.04.2013
comment
Очень рад, что ускорил процесс. Кстати, перемещение/удаление каталогов — это функция, которую я собираюсь добавить в BFG — я добавлю комментарий, когда это будет завершено. Спасибо за предоставленный пример использования! - person Roberto Tyley; 24.04.2013
comment
@ alnorth29 извиняюсь, еще вопрос - каково было обоснование перемещения подкаталога? Почему это было необходимо? - person Roberto Tyley; 01.05.2013
comment
Это должно было обойти ограничение с помощью одного из инструментов сборки командной строки Microsoft. Visual Studio может компилировать веб-сайты ASP.NET, вложенные один в другой, но инструмент сборки из командной строки не может. Мы настраиваем сервер непрерывной интеграции, и нам нужно рабочее решение для сборки из командной строки. Спасибо за помощь, переписка сделана и вроде все хорошо. - person alnorth29; 01.05.2013
comment
Спасибо за ответ @alnorth29 - я вижу, что это означает, что вам нужно изменить каталоги. Простое исправление каталогов в вашем последнем коммите, должно быть, было вариантом ... поэтому я предполагаю, что дополнительные усилия по изменению вашей истории также должны были позволить вам обеспечить передачу старых сборок на ваш CI. сервер? - person Roberto Tyley; 01.05.2013
comment
Отчасти это так, но у нас также есть 8 веток, которые мы должны объединить. Выполнение перестановки отдельно на каждой ветке, а затем попытка слияния с одной на другую было бы кошмаром. - person alnorth29; 02.05.2013
comment
БФГ супер! Я использовал его для удаления папки, и он работал со скоростью света по сравнению с git filter-branch. Тем не менее, я до сих пор не могу понять, как использовать BFG в случае использования, подобном тому, который был в исходном вопросе. Мой вариант использования именно тот, который обрабатывается этим скриптом: gist.github.com/emiller/6769886 Дело в том, что упомянутый скрипт занял у меня 48 часов в одном репо, которое не является моим самым большим. У меня есть репозиторий еще большего размера, и мне нужно переместить содержимое dir2 в корень репозитория, сохранив историю. Любые идеи о том, как добиться этого с помощью BFG? - person jfoliveira; 11.03.2015
comment
Еще одно спасибо за BFG, здесь. Запуск git-filter-branch (с наивным --tree-filter) занял почти 3 недели, чтобы пройти 97% пути через наш чрезмерно большой репозиторий до того, как виртуальная машина Linux, на которой он работал, пострадала от повреждения файловой системы и вышла из строя (!) . Выполнение той же операции с BFG заняло менее 20 минут и также работало во всех ветках! - person Dave Knight; 14.11.2017

Роберто упомянул об этом в своем ответе, но я хочу дать ориентир для этого: если ваша операция git filter-branch занимает много времени, рассмотрите экземпляр AWS с высокой памятью.

Однажды мне пришлось filter-branch объединить 35 различных репозиториев, каждый из которых имел двухлетнюю историю десятков коммитов в день. Мой скрипт не выполнился за 25 часов на моем ноутбуке. Это было выполнено за 45 минут на экземпляре m2.4xlarge в Amazon.

Общая стоимость?

1,64 доллара — меньше, чем я трачу на 20 унций газировки.

BFG звучит как отличный инструмент, и я бы посоветовал всем, кто регулярно переписывает историю, попробовать его. Но если вам просто нужно что-то, чтобы работать и иметь легкий доступ к AWS, filter-branch это тривиально просто.

В 2016 году это еще дешевле. Просто перейдите на Spot Advisor и найдите что-нибудь из «кластерных вычислений за 0,30 долл. США в час».

person Christopher    schedule 07.05.2013