Мерзавец, фильтр-ветка на все ветки

Я использую следующие источники для удаления некоторых больших файлов и каталогов из моего хранилища:

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 с вашим именем каталога, и он удалит этот каталог из всех веток.

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