2017-03-15 1 views
1

J'ai un fichier de configuration dans mon projet qui est spécifique au serveur, donc je ne veux pas être inclus dans Git car à chaque fois que nous le déployons, il écrase les paramètres du serveur. Pour résoudre ce problème, le fichier a été supprimé de Git ... bonne idée mais maintenant, chaque fois que le projet est déployé, le fichier de configuration des serveurs est supprimé.Comment puis-je ajouter un fichier à mon .gitignore sans le supprimer?

Je suis maintenant coincé avec un problème. Ce que je voulais vraiment, c'est que le fichier soit en .gitignore et jamais ajouté au projet, mais une fois qu'il a été ajouté, je ne vois pas comment le supprimer du projet sans déclencher une suppression sur le fichier existant à chaque déploiement.

Est-il possible de supprimer un fichier d'un projet sans le supprimer? Ignorer de manière rétrospective un fichier qui a déjà été ajouté?

+2

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 ... –

+1

... 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. –

+1

@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

Répondre

0

Vous pouvez spécifier le (s) fichier (s) inutile (s) dans le fichier .gitignore. Pour que Git ignore les modifications apportées au (x) fichier (s) spécifié (s).

Si vous n'avez pas le fichier .gitignore, vous pouvez simplement le créer et taper le (s) nom (s) à ignorer. Gardez à l'esprit que vous devrez valider le fichier .gitignore une fois que vous l'aurez ajouté au référentiel. Cela indiquera à Git d'ignorer les fichiers spécifiés dans le fichier .gitignore.

En mots courts et simples. Vous créez un fichier nommé .gitignore dans votre référentiel de travail et répertoriez le nom de fichier ou le modèle correspondant à par exemple. Si nous voulons ignorer tous les fichiers .sql. Dans le .gitignore Nous tapez ce qui suit:

*.sql 

Si nous voulons ignorer un seul fichier, permet de dire lib/util.php. Alors le .gitignore ressemblera à ceci:

lib/util.php 

Vous pouvez spécifier plusieurs noms de fichiers à .gitignore que vous le souhaitez.

gitignore documentation

Notez que ceci ne fonctionnera que si le fichier n'a jamais été suivi dans le dépôt pour commencer comme il est indiqué correctement Adelsberger et @torek @ Mark.

+1

Si le fichier est déjà suivi (c.-à-d., dans l'index), mettre son chemin dans un '.gitignore' n'a aucun effet. Vous devez faire le suivi du fichier * un *, ce que l'OP a fait. Le problème est qu'il y a alors un chemin 'git checkout' qui vous donne le fichier (suivi, validé), suivi d'un' git checkout' du commit suivant qui * supprime le fichier de l'arbre de travail *. Une fois qu'il est hors de l'index, tout est OK, sauf que le fichier est parti de l'arbre de travail: il doit être restauré de quelque part (comme le commit où il est présent). – torek

0

Utilisez git log --oneline pour imprimer la liste des journaux de validation et lancez un git reset 'head' pour désassembler les fichiers. Vous pouvez ensuite appliquer le bon modèle .gitignore avant de valider le fichier. Si vous n'avez pas encore validé les fichiers, vous pouvez utiliser git rm --cached pour désassembler les fichiers. Vous trouverez une collection de modèles de gitignore de cette page GitHub https://github.com/github/gitignore

0

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.

0

La manière simple et sûre de résoudre ce problème consiste à ajouter les fichiers que vous souhaitez exclure à .gitignore.

Si le fichier est déjà suivi (précédemment ajouté et validé), vous devrez également le supprimer du référentiel. Cela peut être fait sans supprimer le fichier local que vous voulez conserver en disant à git de ne supprimer que la version suivie.

git rm --cached <file> est la commande qui va le faire. Lorsque vous validez cette modification avec la mise à jour .gitignore, le référentiel arrêtera le suivi et commencera à ignorer ce fichier.