49 votes

Supprimer définitivement un répertoire de git

Dans mon dépôt personnel Git, j'ai un répertoire qui contient des milliers de petites images qui ne sont plus nécessaires. Est-il possible de les supprimer de l'historique complet de git? j'ai essayé

 git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD
 

et

 git filter-branch --tree-filter 'rm -fr imgs' HEAD
 

mais la taille du repo git reste inchangée. Des idées?

Merci

32voto

VonC Points 414372

Le ProGit livre a une section intéressante sur la Suppression de l'Objet.

Il se termine avec ceci:

Votre histoire ne contient plus de référence à ce fichier.
Cependant, votre reflog et un nouvel ensemble de références qui Git ajouté lorsque vous ne l' filter-branch sous .git/refs/original le font encore, de sorte que vous devez les enlever et puis repack la base de données. Vous avez besoin de se débarrasser de tout ce qui a un pointeur de ces vieux s'engage avant de remballer:

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
$ git prune --expire 

(git prune --expire n'est pas obligatoire, mais peut supprimer le contenu du répertoire de l'objets en vrac)
Sauvegarde tout avant de faire ces commandes, juste au cas où ;)

14voto

Antony Stubbs Points 4236

En fait, aucune de ces techniques ne fonctionnait pour moi. J'ai trouvé le plus fiable était de simplement tirer localement dans un autre dépôt:

 git pull file://$(pwd)/myGitRepo
 

Cela vous évite également les tracas liés à la suppression de balises anciennes.

Voir l'histoire sur mon blog: http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

13voto

Jakub Narębski Points 87537

Par défaut, git-filter-branch enregistre les anciennes références dans les espaces de noms refs/original/* .

Vous devez les supprimer, puis faire git gc --prune=now

10voto

Michael Points 530

Brandon Thomson demandé dans un commentaire à Rainer Blome's solution si ce juste fixé le gitk ou si les arbitres sera vraiment disparu. Une bonne façon de vérifier cela est de se rappeler l'un des sha1 les hachages (ou un préfixe unique de celui-ci) de la vieille s'engage et essayer

$ git ls-tree hash-value

Cela devrait vous montrer le contenu du repos dossier principal, comme c'était dans ce commit. Après

$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/

comme indiqué par VonC et de retrait de l' refs/original/… lignes .git/info/refs et .git/packed-refs comme indiqué par Rainer Blome, une finale

$ git gc --prune=now

non seulement les refs, mais aussi le vieux objets (les livraisons, les arbres, et les blobs) s'en aller. L'montrés ci - git ls-tree hash-value le prouve. Un autre bon de commande pour vérifier c'est - git count-objects -v (à exécuter avant le filtre-brach et après l'élagage et de comparer la taille).

Note: Comme je n'ai pas le droit de commenter les autres réponses, j'ai dû en écrire un nouveau, bien qu'il combine principalement précédente donné les réponses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X