2010-08-20 5 views
0

Plusieurs articles parlent de supprimer un fichier ou un répertoire de GIT - mais ils ne vont pas jusqu'à expliquer comment PUSH ces modifications dans le dépôt principal.Comment valider après avoir supprimé un répertoire de GIT

Par exemple, this fonctionne très bien pour supprimer le répertoire, mais lorsque je tente de pousser ce changement à la prise en pension principale Git, je me refuse:

! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '/repo/project.git' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes before pushing again. See the 'non-fast forward' 
section of 'git push --help' for details. 

Quelle est la dernière étape pour pousser réellement ce à le principal repo et effectivement supprimer ce répertoire?

+1

Je suppose que non seulement vous avez supprimé le répertoire par 'git rm', mais vous avez aussi réécrit l'historique entier. Si vous modifiez les anciennes validations, vous ne pouvez pas valider en plus de celles qui restent sur le serveur. –

Répondre

2

Lorsque vous supprimez quelque chose de manière agressive, vous réécrivez l'historique. Par conséquent, le référentiel en amont rejette votre modification car cela entraînerait une perte d'historique. Dans ce cas, vous devrez utiliser

git push --force 
+1

... mais vous devez comprendre ce que vous faites, et assurez-vous que vous voulez vraiment le faire. Vois ma réponse. – Cascabel

+0

Vous avez rarement envie de - pousser une poussée. 99% du temps, les inconvénients l'emportent sur les avantages. – brycemcd

+0

Oui, appréciez les avertissements et comprenez que ce n'est certainement pas une bonne pratique, surtout en groupe. Dans mon cas, c'est juste moi et j'ai accidentellement commis un code auto-généré que je ne veux pas dans le repo (et je veux me sentir comme un Git Ninja :) et c'était un bord-case dont j'avais besoin pour mieux comprendre comment adopter. –

1

réponse Nick Lewis est suffisant, mais je veux juste ajouter une certaine importance, plus se tenir dans un commentaire. Voici une citation de la page de manuel git filter-branch:

AVERTISSEMENT! L'historique réécrit aura différents noms d'objets pour tous les objets et ne convergera pas avec la branche d'origine. Vous ne pourrez pas facilement pousser et distribuer la branche réécrite au-dessus de la branche d'origine. S'il vous plaît n'utilisez pas cette commande si vous ne connaissez pas toutes les implications, et évitez de l'utiliser quand même, si un simple commit suffirait à résoudre votre problème. (Voir la « RECUPERATION DE REBASE AMONT » section git-rebase(1) pour plus d'informations sur la réécriture historique publiée.)

Italique souligné dans l'- c'est assez important. Filter-branch réécrit vraiment l'histoire, il va bousiller toute personne qui est clonée/tirée de votre repo, et c'est effrayant. Vous devriez vraiment savoir tout cela avant de l'essayer. La plupart des gens ici sont assez bons à fournir ce rappel chaque fois qu'ils recommandent filter-branch ou rebase; Je pense qu'il est approprié d'en avoir une assez forte répétition ici, sur une question où la réponse est push --force afin de réécrire complètement l'historique de votre dépôt public. C'est une opération effrayante.