web-dev-qa-db-fra.com

git, filtre-branche sur toutes les branches

J'utilise les sources suivantes pour supprimer certains fichiers et répertoires volumineux de mon référentiel:

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

Pourquoi mon dépôt git est-il si gros?

git filter-branch ne semble fonctionner que sur la branche actuelle - existe-t-il un moyen de l'appliquer à toutes les branches à la fois?

53
EoghanM

La solution est simple:

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

Notez les quatre tirets (deux ensembles de tirets doubles avec un espace entre les deux) dans -- --all.

Si vous regardez la documentation de git-filter-branch, il dit ceci:

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

En poursuivant votre lecture, le début de la documentation dit: "Vous permet de réécrire l'historique des révisions git en réécrivant les branches mentionnées dans les <options de la liste de rév.>, En appliquant des filtres personnalisés à chaque révision."

Donc, vérifiez les documents pour rev-list donne:

<options rev-list>… Arguments pour git rev-list. Toutes les références positives incluses par ces options sont réécrites. Vous pouvez également spécifier des options telles que --all, mais vous devez utiliser - pour les séparer des options git filter-branch.

Et les documents pour git-rev-list dire:

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

Comme l'explique la réponse de @ ben-lee, --all est requis pour réécrire toutes les branches. Si vous avez balises dans votre référentiel, vous voudrez nettoyer tous les ceux, ainsi que les branches, afin de bénéficier des avantages de la réduction de taille, et cela nécessitera un --tag-name-filter cat incantation.

Bien que la question spécifie l'utilisation de git filter-branch, le questionneur veut ' effacer certains fichiers et répertoires volumineux de mon référentiel', il convient donc de mentionner que le meilleur l'outil pour le faire est en fait The BFG Repo Cleaner, une alternative plus simple et plus rapide à git filter-branch. Par exemple:

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

... supprime tous les blobs supérieurs à 10 Mo (qui ne figurent pas dans votre dernier commit), et fonctionne sur tous branches et balises dans votre référentiel.

Divulgation complète: je suis l'auteur du BFG Repo-Cleaner.

5
Roberto Tyley

J'ai suivi toutes les instructions pour le faire sur ma boîte Windows, mais j'ai continué à recevoir une erreur, jusqu'à ce que j'arrête d'utiliser des guillemets simples et à la place des guillemets doubles.

Ma motivation était que j'ai accidentellement vérifié dans mon environnement vagrant. Voici la commande pour supprimer le dossier vagrant de toutes les branches:

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

Remplacez simplement vagrant par le nom de votre répertoire, et il supprimera ce répertoire de toutes les branches.

4
Paul Preibisch