web-dev-qa-db-fra.com

Supprimer complètement les fichiers du dépôt Git et de la télécommande sur GitHub

J'ai accidentellement ajouté un dossier d'images et commis. Ensuite, j'ai fait un autre engagement. Ensuite, j'ai supprimé ces fichiers en utilisant git rm -f ./images Et commis à nouveau.

À l'heure actuelle, j'ai effectué beaucoup plus de commits dans cette branche (maître). Dans ma tête, je n'ai pas ce dossier ./static/images.

Pour cette raison, la taille de mon repo a beaucoup augmenté. Comment puis-je supprimer ces blobs complètement? Et je veux aussi le supprimer de mon dépôt GitHub distant.

76
Abhijeet Rastogi

Voici ce que vous recherchez: ignorer ne supprime pas un fichier . Je vous suggère de lire cette page, mais voici la commande spécifique à utiliser:

git filter-branch --index-filter \
'git rm -r --cached --ignore-unmatch <file/dir>' HEAD

De plus, pour supprimer tous les fichiers supprimés des caches créés par git, utilisez:

rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --Prune

Vous pouvez trouver plus d'informations sur la dernière commande, ainsi qu'un script qui fait tout ce que vous voulez en une seule action, ici: git: toujours supprimer les fichiers ou les dossiers de l'historique .

Un autre lien avec beaucoup d'explication: Supprimer les données sensibles .

[Edit] Consultez également cette question de StackOverflow: Supprimez les fichiers sensibles et leurs validations de l'historique Git .

(Les commandes copiées à partir de la réponse de natacado dans la question liée ci-dessus.) Si vous avez déjà supprimé les fichiers de la copie de travail, les opérations suivantes devraient fonctionner. Découvrez le hachage pour la validation qui a ajouté les fichiers indésirables. Alors fais:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git Push --force --verbose --dry-run
git Push --force
124
Darhuuk

Vous pouvez simplement rebaser toute votre branche et supprimer à la fois le commit qui a ajouté les images et le commit qui les a supprimés.

git rebase -i master

Une liste de commits vous sera présentée. Supprimez les lignes contenant les commits indésirables que vous souhaitez supprimer. ("dd" supprime une ligne dans vim, l'éditeur par défaut. Puis enregistrez avec ZZ)

Les commits pendants seront ensuite nettoyés au cours de la collecte naturelle des déchets git, processus que vous pouvez forcer avec la commande donnée dans la réponse de Darhuuk.

Edit: Cela fonctionnera même si vous avez poussé dans un référentiel distant, mais vous devrez pousser avec --force. (Il en va de même pour la solution git filter-branch).

Notez que cela sera très ennuyeux pour quiconque a quitté votre branche. Ils devraient consulter "récupérer de la base amont" .


Vraisemblablement, votre ajout accidentel d’images fait partie d’un commit que vous souhaitez conserver. Dans ce cas, vous devez éditer le commit lors de la création d'une base pour séparer les parties que vous souhaitez conserver. Vous pouvez le faire en remplaçant "pick" dans la liste "rebase -i" de ce commit par "e" (pour le modifier). Le processus de rebase s'arrête ici et vous pouvez scinder le commit avec "git commit --amend".

9
RJFalconer

Je répète essentiellement la réponse combinée avec ceci mise en garde concernant le formatage de Windows , uniquement pour ne pas se perdre en tant que commentaire.

Notez l'utilisation de guillemets plutôt que de guillemets simples, car cela dépend du shell que vous utilisez pour analyser les chaînes.

Une seule ligne:

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch <file/dir>" HEAD

Lignes multiples:

git filter-branch --index-filter \
    "git rm -r --cached --ignore-unmatch <file/dir>" HEAD
3
drzaus