Мерзавец, фильтр-ветка на все ветки
Я использую следующие источники для удаления некоторых больших файлов и каталогов из моего хранилища:
http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
Почему мой репозиторий Git такой большой?
git filter-branch
только кажется, работает на текущей ветви - есть ли способ применить его ко всем ветвям одновременно?
3 ответа
Решение простое:
git filter-branch [options] -- --all
Обратите внимание на четыре тире (два набора двойных тире с пробелом между ними) в -- --all
,
Если вы посмотрите на документы для git-filter-branch
, это говорит это:
git filter-branch [--env-filter <command>] [--tree-filter <command>]
[--index-filter <command>] [--parent-filter <command>]
[--msg-filter <command>] [--commit-filter <command>]
[--tag-name-filter <command>] [--subdirectory-filter <directory>]
[--prune-empty]
[--original <namespace>] [-d <directory>] [-f | --force]
[--] [<rev-list options>…]
Читая дальше, в начале документа говорится: "Позволяет переписывать историю изменений git, переписывая ветви, упомянутые в <опциях rev-list>, применяя пользовательские фильтры к каждой ревизии".
Так что проверяя документы для rev-list
дает:
<опции rev-list>… Аргументы для git rev-list. Все положительные ссылки, включенные в эти параметры, переписаны. Вы также можете указать такие параметры, как --all, но вы должны использовать -, чтобы отделить их от параметров git filter-branch.
И документы для git-rev-list
сказать:
--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
Как объясняет ответ @ben-lee, --all
требуется для переписывания всех веток. Если у вас есть метки в репо, вам нужно будет очистить все эти, а также ветки, чтобы получить преимущества в уменьшении размера, что потребует дополнительного --tag-name-filter cat
заклинание.
Хотя вопрос уточняет использование git filter-branch
спрашивающий хочет " удалить из моего репозитория несколько больших файлов и каталогов ", поэтому стоит упомянуть, что лучшим инструментом для этого на самом деле является BFG Repo Cleaner, более простая и быстрая альтернатива git filter-branch
, Например:
$ bfg --strip-blobs-bigger-than 10M
... удаляет все BLOB-объекты размером более 10 МБ (которых нет в вашем последнем коммите) и работает со всеми ветками и тегами в вашем репо.
Полное раскрытие: я являюсь автором BFG Repo-Cleaner.
Я следовал всем инструкциям для этого на моем Windows-устройстве, но продолжал получать сообщение об ошибке, пока я не перестал использовать одинарные кавычки и вместо этого использовал двойные кавычки.
Моя мотивация заключалась в том, что я случайно проверил vagrant
среда. Вот команда, чтобы удалить vagrant
папка из всех веток:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all
Просто замени vagrant
с вашим именем каталога, и он удалит этот каталог из всех веток.