Git, ветвь фильтра на всех ветвях

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

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

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

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

Ответ 1

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

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 options > , применяя настраиваемые фильтры для каждой ревизии."

Таким образом, проверка документов для rev-list дает:

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

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

--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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