La différence entre « fichier n'a jamais été vérifié et est .gitignored » par rapport à « le fichier a été archivé mais rm-ed et a depuis été. gitignored "est moins que ce que vous déduisez. Si n'a jamais ajouté le fichier et le mettre en .gitignore aurait fonctionné comme prévu, puis après avoir supprimé le fichier, vous pouvez le mettre en .gitignore et, après éventuellement un tour de difficulté, il devrait commencer à travailler.
(Ce serait le cas, par exemple, si vous utilisez git pull
de mettre à jour le serveur La traction du commit qui a supprimé le fichier pourrait supprimer le fichier -. Mais il devrait apparaître comme un conflit.Mais les tirages suivants ignorent le fichier, surtout si vous l'avez depuis ajouté à .gitignore. Mais je digresse, et j'ai couvert ma confusion ici dans les commentaires ...)
Donc la question était de savoir comment supprimer un fichier de l'histoire comme si elle n'avait jamais été ajoutée, et même si je doute que cela aidera, Voici comment vous pouvez le faire:
Vous devez "réécrire" la validation (ou les validations) qui a introduit le fichier, ainsi que tout commit descendant d'une telle validation. S'il s'agit d'un référentiel partagé, après la réécriture, tout le monde devra passer à la réécriture - le plus facilement possible en demandant à tout le monde de se débarrasser de son repo actuel et de le re-cloner. Cela signifie que vous devez coordonner une fenêtre "sans changement"; Si quelqu'un fait un changement après la coupure au début de cette fenêtre, il devra être rebasé dans l'arbre réécrit.
Maintenant si le fichier a été ajouté récemment et qu'il n'y a pas beaucoup d'historique après le commit qui l'a introduit, cela peut être un processus relativement simple et vous pouvez même prendre quelques raccourcis. Mais la solution générale consiste à utiliser soit git filter-branch
soit le nettoyeur de référentiel BFG. Sur les deux, BFG est plus facile et plus rapide (car c'est l'une des tâches pour lesquelles il est spécifiquement conçu). Son auteur pense que la seule procédure sécurisée consiste à supprimer manuellement le fichier des validations en cours, à vérifier que tout fonctionne correctement dans le commit actuel, puis à utiliser BFG pour nettoyer l'historique. Je pense que c'est trop pédant et lui a expliqué pourquoi, mais il persiste; donc tu devrais te décider.
Si vous choisissez d'utiliser filter-branch
, vous utiliserez un filtre d'index; C'est l'un des exemples de stock dans la documentation du filtre git, donc je voudrais juste regarder là-bas.
Comment déployez-vous? Puisque vous ne mentionnez que git, je déduirais que vous déployez par un git pull; mais cela ne devrait pas se comporter comme vous l'avez décrit. Le pull * du commit qui a effacé le fichier * peut effacer le fichier (cependant, si le fichier local ne correspond pas à la dernière version de git, il devrait apparaître comme un conflit); mais après cela, une fois que le fichier est de nouveau en place, les tirages suivants (des validations qui n'ont aucune relation avec le fichier) ne devraient pas affecter le fichier. Le fichier devrait apparaître comme "non suivi" à moins que vous ne leigniez. Cela dit ... –
... puisque le comportement que vous décrivez diffère de ce que git devrait faire, je suppose que vous utilisez une autre méthode pour le déployer. Mais si * vous utilisez une autre méthode à déployer, le fait que le fichier ait été en git n'a aucun effet sur le processus de déploiement. Cela dit, je fournirai une réponse qui répond à la question posée; mais je pense qu'une clarification de ce point serait utile. –
@MarkAdelsberger a raison: Git ne * supprime * le fichier que sur un "git checkout" qui vous amène d'une situation où le fichier de configuration est dans l'index et l'arbre de travail, à un commit où le fichier de configuration est * pas présent. Cependant, chaque fois que vous passez à un commit qui * contient * le fichier, puis à un autre *, Git le remplace et le supprime (à condition qu'il soit autorisé, soit parce qu'il n'y a pas de changements dans index + travail -tree, ou parce que vous avez utilisé '--force'). D'où "comment déployez-vous" est une question cruciale. – torek