Supprimer un répertoire de façon permanente à partir de git
Dans mon repo git, j'ai un répertoire qui contient des milliers de petites images qui ne sont plus nécessaires. Est-il un moyen de les supprimer de l'ensemble de l'historique 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é. Des idées?
Grâce
- Pas sûr, mais avez-vous essayé de lancer
git gc
après? Peut-être qu'ils sont encore là comme des déchets... - oui je suis
- Vous devrez supprimer toutes les anciennes références (par exemple, les noms de branches, tags), et vous pouvez exécuter
git gc --aggressive
par la suite.
Vous devez vous connecter pour publier un commentaire.
En fait, aucune de ces techniques workedfor moi.
J'ai trouvé le plus fiable a été a été à, il suffit de tirer localement dans un autre repo:
Il enregistre également vous les tracas de la deletig de vieilles étiquettes.
voir l'article sur mon blog:
http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
La ProGit livre a une section intéressante sur Suppression D'Objets.
Il n'fin à cette situation:
(
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ù 😉
git-filter-branch par défaut enregistre vieux refs dans
refs/original/*
espace de noms.Vous avez besoin de les supprimer, et puis ne
git gc --prune=now
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
Cela devrait vous montrer le contenu du repos dossier principal, comme c'était dans ce commit. Après
comme indiqué par VonC et la suppression de la
refs/original/…
lignes de.git/info/refs
et.git/packed-refs
comme indiqué par Rainer Blome, une finalefait, non seulement la refs, mais aussi le vieux objets (les livraisons, les arbres, et les blobs) s'en aller. Ci-dessus le montre
git ls-tree hash-value
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).Remarque: Que 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.
Si vous voulez aller le manuel de nettoyage de la route, il y a plus de fichiers qui peuvent également contenir des
une ref à la position initiale de votre branche git-filter-branch.
Par exemple, j'ai filtré mon "home" de la direction de la
.git/info/réf:
.git/emballé-réf:
Après que j'ai retiré de ces lignes, gitk n'a pas montré le vieux s'engage plus.
Que c'est une vieille question, peut-être certains de ce qui n'était pas possible à l'époque. Cela suppose également que vous utilisez bash ou cygwin.
Avertissement: Les deuxième et troisième lignes de supprimer définitivement tous les commits inaccessible de vos branches/tags.
Après l'exécution de
filter-branch
, negit for-each-ref --format='%(refname)'
obtient les noms de référence, etgit update-ref -d
supprime la référence. Il est généralement préférable de ne pas modifier le.git
dossier directement, et en particulier cette commande gère le cas lorsque les arbitres sont danspacked-refs
.Les deuxième et troisième lignes sont prises directement à partir de Comment nettoyer le côté inutilisé-branches dans votre commettent des arbres?.