git, filter-branch na wszystkich gałęziach

Używam następujących źródeł do usuwania dużych plików i katalogów z mojego repozytorium:

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

Dlaczego moje repozytorium git jest tak duże?

git filter-branch tylko wydaje się działać na bieżącej gałęzi - czy istnieje sposób, aby zastosować go do wszystkich gałęzi na raz?

Author: Community, 2011-09-15

3 answers

Rozwiązanie jest proste:

git filter-branch [options] -- --all

zwróć uwagę na cztery myślniki (dwa zestawy podwójnych myślników ze spacją pomiędzy) W -- --all.

Jeśli spojrzysz na dokumenty dla git-filter-branch, mówi to:

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>…]

Czytając dalej, początek dokumentu mówi: "pozwala przepisać historię rewizji Gita przez przepisanie gałęzi wymienionych w opcjach , stosując własne filtry do każdej rewizji."

Więc sprawdzanie dokumentów dla rev-list daje:

... Arguments for git rev-list. Wszystkie pozytywne refy zawarte przez te opcje są przepisywane. Możesz również określić opcje takie jak -- wszystkie, ale musisz użyć -- aby oddzielić je od Gita opcje filter-branch.

I dokumenty dla git-rev-list mówią:

--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
 67
Author: Ben Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-21 12:02:23

Jak wyjaśnia odpowiedź @ ben-lee, --all jest wymagane do przepisania wszystkich gałęzi. Jeśli masz tagi w repo, będziesz chciał wyczyścić wszystkie te , a także gałęzie, aby uzyskać korzyści z redukcji rozmiaru, a to będzie wymagało dodatkowego --tag-name-filter cat zaklęcie.

Chociaż pytanie określa użycie git filter-branch, pytający chce " usunąć niektóre duże pliki i katalogi z mojego repozytorium ", warto więc wspomnieć, że najlepszym narzędziem do tego jest BFG Repo Cleaner, prostsza, szybsza alternatywa dla git filter-branch. Na przykład:

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

...usuwa wszystkie obiekty BLOB większe niż 10MB (które nie znajdują się w ostatnim commicie ) i działa na wszystkich gałęziach i tagach w repo.

pełne ujawnienie: jestem autorem BFG Repo-Cleaner.

 6
Author: Roberto Tyley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:14

Postępowałem zgodnie ze wszystkimi instrukcjami w moim oknie Windows, ale ciągle otrzymywałem błąd, dopóki nie przestałem używać pojedynczych cudzysłowów i zamiast tego używałem podwójnych cudzysłowów.

Moją motywacją było to, że przypadkowo sprawdziłem w moim środowisku. Oto polecenie usunięcia folderu vagrant ze wszystkich gałęzi:
git filter-branch --tree-filter "rm -rf vagrant" -f HEAD --all

Po prostu zastąp vagrant swoją nazwą katalogu, a to usunie ten katalog ze wszystkich gałęzi.

 3
Author: Paul Preibisch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 12:44:56