Supprimez complètement les fichiers de Git repo et remote sur GitHub

j'ai accidentellement ajouté un dossier d'images et commis. Ensuite, j'ai fait une de plus s'engager. Puis j'ai retiré ces fichiers en utilisant git rm -f ./images et je les ai engagés à nouveau.

en ce moment, j'ai fait beaucoup plus s'engage dans cette branche (master). Dans ma tête, je n'ai pas ce dossier ./static/images .

pour cette raison, ma taille de pension a beaucoup augmenté. Comment puis-je enlever ces taches complètement? Et je veux l'enlever de ma télécommande GitHub repo aussi.

76
demandé sur Nick Volynkin 2011-04-06 12:36:02

3 réponses

C'est 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

aussi, pour supprimer tous les fichiers supprimés des caches que git crée, 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: pour toujours supprimer des fichiers ou les dossiers de l'histoire .

un autre lien avec beaucoup d'explications: supprimer les données sensibles .

[Edit] Voir aussi cette question StackOverflow: supprimer les fichiers sensibles et leurs commits de l'historique Git .

(commandes copiées de la réponse de natacado dans la question liée ci-dessus.) Si vous avez déjà supprimé les fichiers de travail la copie, la suivante devrait fonctionner. Découvrez le hachage pour la propagation qui a ajouté les fichiers indésirables. Puis faire:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
124
répondu Darhuuk 2017-05-23 11:46:13

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

vous recevrez une liste de commits. Supprimer les lignes qui ont le voleur commet vous souhaitez supprimer. ("dd" supprime une ligne dans vim, l'éditeur par défaut. Puis sauvegarder avec ZZ)

les charges pendantes seront ensuite nettoyées au cours de la collecte des ordures naturelles git, un processus que vous pouvez force avec le commandement donné dans la réponse de Darhuuk.

Edit: cela fonctionnera même si vous avez poussé vers un dépôt 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 retiré de votre branche. Ils doivent consulter "récupérer de rebase amont" .


probablement votre ajout accidentel d'images fait partie d'un commit que vous souhaitez conserver. Dans ce cas, vous devez modifier le commis pendant le rebase pour diviser les parties que vous souhaitez conserver. Vous pouvez le faire en remplaçant "pick" dans la liste "rebase-i" pour ce commit par " e " (pour edit). Le processus de rebase s'arrêtera ici et vous pouvez partager la propagation avec "git commit --amend".

9
répondu RJFalconer 2017-06-20 08:33:24

je répète essentiellement la réponse combiné avec ce Windows formatting caveat , seulement pour qu'il ne se perd pas comme un commentaire.

notez l'utilisation de guillemets doubles plutôt que de guillemets simples, car cela dépend de l'interpréteur de commandes 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
répondu drzaus 2017-05-23 12:32:00