git filter-branch sur toutes les branches

J'utilise les sources suivantes pour effacer 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 si grand?

git filter-branch ne semble que le travail sur la branche courante, existe - il un moyen de l'appliquer à toutes les branches à la fois?

46
demandé sur Community 2011-09-15 16:21:21

3 réponses

La solution est simple:

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

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

Si vous regardez les documents pour git-filter-branch, il est 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 lisant, le début des documents dit: "vous permet de réécrire l'historique des révisions git en réécrivant les branches mentionnées dans les , en appliquant des filtres personnalisés à chaque révision."

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

... Arguments pour git rev-liste. Tous les refs positifs inclus par ces options sont réécrites. Vous pouvez également spécifier des options comme --all, mais vous devez utiliser -- pour les séparer du git filtre-options de branche.

Et les documents pour git-rev-list disent:

--all
Pretend as if all the refs in refs/ are listed on the command line as <commit>.
67
répondu Ben Lee 2016-05-21 12:02:23

Comme l'explique la réponse de @ben-lee, --all est nécessaire pour réécrire toutes les branches. Si vous avez tags dans votre repo, vous voudrez nettoyer tous les ceux , ainsi que les branches, afin d'obtenir les avantages de la réduction de taille, et cela nécessitera un supplément --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 le meilleur outil pour le faire est en fait Le nettoyeur de Repo BFG, une alternative plus simple et plus rapide à git filter-branch. Par exemple:

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

...supprime tous les blobs de plus de 10 Mo (qui ne sont pas dans votre dernière commit), et fonctionne sur toutes les branches et les balises dans votre repo.

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

6
répondu Roberto Tyley 2017-05-23 10:31:14

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

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 votre nom de répertoire, et il supprimera ce répertoire de toutes les branches.

3
répondu Paul Preibisch 2017-07-12 12:44:56