Comment supprimer un fichier trop grand dans un commit quand ma branche est en avance sur master by 5 commits
j'ai été bloqué toute la journée sur cette question, en cherchant une réponse ici :( ...
Contexte
je travaille seul sur un projet et j'ai utilisé github jusqu'à présent pour sauver mon travail autrement que sur mon ordinateur. Malheureusement, j'ai ajouté un très gros fichier au dépôt local: 300 Mo (qui dépasse la limite de Github).
Ce que j'ai fait
je vais essayer de faire une histoire de ce que j'ai fait :
je (dumbly) ajouté tout à l'index :
git add *
j'ai commis des changements :
git commit -m "Blablabla"
j'ai essayé de pousser à l'origine de maître
git push origin master
cela a pris un certain temps, donc j'ai juste CTRL+C, et j'ai répété les étapes 2 et 3 quatre fois, jusqu'à ce que je réalise qu'un fichier était trop gros pour être poussé à github.
j'ai fait la terrible erreur de supprimer mon gros Fichier (Je ne me souviens pas si j'ai fait une rm)
j'ai suivi les instructions sur (https://help.github.com/articles/remove-sensitive-data)
Quand j'essaie de git filter branche, j'obtiens l'erreur suivante : "Impossible de réécrire branches: Vous avez unstaged changements."
Merci d'avance !
5 réponses
lorsque vous supprimez votre fichier, ce sera un changement et c'est le changement non stabilisé dont se plaint git. Si vous faites un statut git, vous devriez voir le fichier comme supprimé. Pour annuler ce changement vous devriez git checkout -- <filename>
. Alors le dossier sera de retour et votre branche devrait être propre. Vous pouvez aussi git reset --hard
cela vous ramènera au statut où vous vous êtes engagé.
je suis en supposant que c'est le dernier commit qui a le très gros fichier que vous voulez supprimer. Vous pouvez faire un git reset HEAD~
puis vous pouvez refaire la propagation (en n'ajoutant pas le gros fichier). Ensuite, vous devriez être en mesure de git push
sans problème.
puisque le fichier n'est pas dans la dernière propagation, vous pouvez effectuer les dernières étapes sans problème. Vous avez juste besoin de vos modifications validées ou supprimé.
une solution simple que j'ai utilisée:
git reset HEAD^
pour autant s'engage vous souhaitez l'annuler, elle permet de conserver vos modifications et de votre état de vos fichiers, juste rinçage de la commet.Une fois que les propagations sont désactivées, vous pouvez penser à la façon de propager vos fichiers d'une meilleure manière, par exemple: supprimer/ignorer les gros fichiers, puis ajouter ce que vous voulez et puis recommencer. Ou utiliser L'EFT Git pour suivre ces énormes fichier.
la solution de github est assez soignée. J'ai fait quelques erreurs avant de pousser, donc c'est plus difficile à défaire. La solution de Githubs est : Supprimer le fichier ajouté dans un ancien commit
si le gros fichier a été ajouté dans une propagation précédente, vous devrez le supprimer de votre historique de dépôt. La façon la plus rapide de le faire est avec le BFG (une alternative plus rapide, plus simple à git-filter-branch):
bfg --strip-blobs-bigger-than 50M
# Git history will be cleaned - files in your latest commit will *not* be touched
C'est en référence à la BFG post ci-dessus, je voudrais commenter directement, mais je n'ai aucune idée de la façon de le faire que d'une faible réputation nouvel utilisateur.
vous pouvez faire un 'git gc' pour remballer en premier.
j'avais des problèmes à faire fonctionner BFG jusqu'à ce que je le fasse, cela semble être un problème courant si vous avez seulement travaillé dans un repo local et préparez des trucs à mettre sur une télécommande pour la première fois.
google pertinent hit qui m'a twiggé à elle: https://github.com/rtyley/bfg-repo-cleaner/issues/65
il semble que votre seul problème soit d'avoir des changements non stabilisés. Vous n'avez pas donné de détails sur ce qui était en fait hors de la synchronisation, donc c'est un tir dans le noir, mais en supposant que vous simple-rm
d le fichier à l'étape 4, vous auriez du le ramener dans l'index:
git checkout large_file
si ce n'est pas le cas, vous êtes seul. Votre but est de vous assurer que votre index et votre arbre de travail sont dans le même état. Cela montre que git status
ne rien signaler à commettre, répertoire de travail propre.
le option nucléaire pour assurer un arbre propre serait git reset --hard
. Si vous voulez essayer cela, faites une sauvegarde de votre tree+repo à l'avance.
une fois que votre copie de travail est propre, vous pouvez procéder aux étapes 5 et 6.