мерзавец, фильтр-ветка на все ветки - PullRequest
47 голосов
/ 15 сентября 2011

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

http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

Почему мой репозиторий git такой большой?

git filter-branch, кажется, работает только в текущей ветви - есть ли способ применить его ко всем ветвям одновременно?

Ответы [ 3 ]

72 голосов
/ 15 сентября 2011

Решение простое:

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 дает:

<опции списка ревизий> ... Аргументы для списка ревью git.ссылки, включенные в эти опции, переписаны. Вы также можете указать такие опции, как --all, но вы должны использовать -, чтобы отделить их от опций git filter-branch.

И документы для git-rev-list говорят:

--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
5 голосов
/ 22 января 2014

Как объясняет ответ @ ben-lee, --all требуется для переписывания всех веток.Если у вас есть теги в вашем репо, вы захотите очистить все эти , а также ветви, чтобы получить преимущества в уменьшении размера, и для этого потребуетсядополнительно --tag-name-filter cat заклинание.

Хотя вопрос задается с использованием git filter-branch, спрашивающий хочет « удалить некоторые большие файлы и каталоги из моего репозитория », поэтомуСтоит отметить, что лучший инструмент для этого на самом деле Очиститель репо BFG , более простая и быстрая альтернатива git filter-branch.Например:

$ bfg --strip-blobs-bigger-than 10M

... удаляет все BLOB-объекты размером более 10 МБ (которых нет в вашем последнем коммите) и работает на всех ветвях итеги в вашем репо.

Полное раскрытие: я являюсь автором репо-уборщика BFG.

4 голосов
/ 07 февраля 2014

Я следовал всем инструкциям для этого на моем Windows-устройстве, но продолжал получать сообщение об ошибке, пока я не перестал использовать одинарные кавычки и вместо них использовал двойные кавычки.

Моя мотивация состояла в том, что я случайно проверил в своей vagrant среде. Вот команда для удаления папки vagrant из всех веток:

git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all

Просто замените vagrant именем вашего каталога, и он удалит этот каталог из всех ветвей.

...