Appliquer .gitignore sur un référentiel existant qui suit déjà un grand nombre de fichiers


314

J'ai un projet Visual Studio existant dans mon référentiel. J'ai récemment ajouté un fichier .gitignore sous mon projet et je suppose que cela dit à Git d'ignorer les fichiers répertoriés dans le fichier.

Mon problème est que tous ces fichiers sont déjà suivis et pour autant que je sache, Git n'ignorera pas un fichier qui a déjà été suivi avant qu'une règle ne soit ajoutée à ce fichier pour l'ignorer.

Il a été suggéré d'utiliser: git rm --cachedet de les supprimer manuellement, mais cela me prendra une éternité pour les parcourir un par un.

J'ai pensé à supprimer le référentiel et à le recréer à nouveau mais cette fois avec le fichier .gitignore présent, mais il doit y avoir une meilleure façon de le faire.


1
vous pouvez git rm --cacheddes répertoires entiers avec l' -roption, si cela est utile
Nathan Wallace



Réponses:


871

Cette réponse a résolu mon problème:

Tout d'abord, validez toutes les modifications en attente.

Exécutez ensuite cette commande:

git rm -r --cached .

Cela supprime tout de l'index, puis lancez simplement:

git add .

Engagez-le:

git commit -m ".gitignore is now working"

9
Réponse parfaite! Veuillez ajouter un git push originégalement pour refléter les changements dans le référentiel distant.
Sanket Berde

8
J'ai commencé à utiliser cette réponse ... et elle a supprimé presque tout dans mon projet! De toute évidence, je faisais quelque chose de mal. Mais je tiens à avertir les gens de ne pas suivre cette suggestion avec désinvolture.
Mark Olbert

4
Est-ce que cela finit par perdre l'historique des fichiers lorsque vous les supprimez et les ajoutez à nouveau
Aran Mulholland

10
Je me demande combien de commits utilisent ce .gitignore is now workingmessage. :)
ihavenoidea

1
Cette méthode a bien fonctionné pour moi. J'ai créé un fichier gitignore, ignoré un répertoire entier, puis commis ce changement de création du gitignore. J'ai ensuite suivi ces trois commandes ci-dessus exactement comme elles l'ont dit. Cela a parfaitement fonctionné, mais je dois dire que vous devez "valider toutes les modifications en attente" d'abord comme indiqué ci-dessus.
Erich Meissner

61
  1. Créez un fichier .gitignore, pour ce faire, il vous suffit de créer un fichier .txt vierge.

  2. Ensuite, vous devez changer son nom en écrivant la ligne suivante sur la cmd (où git.txtest le nom du fichier que vous venez de créer):

    rename git.txt .gitignore

  3. Ensuite, vous pouvez ouvrir le fichier et écrire tous les fichiers non suivis que vous souhaitez ignorer définitivement. Par exemple, le mien ressemble à ceci:

`` ''

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Il y a toute une collection de fichiers .gitignore utiles par GitHub

  1. Une fois que vous avez cela, vous devez l'ajouter à votre référentiel git comme tout autre fichier, seulement il doit être à la racine du référentiel.

  2. Ensuite, dans votre terminal, vous devez écrire la ligne suivante:

    git config --global core.excludesfile ~ / .gitignore_global

Du document officiel:

Vous pouvez également créer un fichier global .gitignore, qui est une liste de règles pour ignorer les fichiers dans chaque référentiel Git sur votre ordinateur. Par exemple, vous pouvez créer le fichier dans ~ / .gitignore_global et y ajouter des règles.

Ouvrez le terminal. Exécutez la commande suivante dans votre terminal: git config --global core.excludesfile ~ / .gitignore_global

Si le référentiel existe déjà, vous devez exécuter ces commandes:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Si l'étape 2 ne fonctionne pas, vous devez écrire la route des trous des fichiers que vous souhaitez ajouter.


4
@Karen_Wiznia la "git config ... _global" crée un gitingore global pour tous les dépôts Git sur l'ordinateur. Le PO ne voulait pas faire ça.
ivan7707

J'aimerais pouvoir aimer cela plus d'une fois, je reviens continuellement à cette question en cherchant ce rappel.
Antony D'Andrea

1
Il doit s'agir de "mv git.txt .gitignore" au lieu de "renommer git.txt .gitignore".
Ahmad F

30

Comme spécifié ici Vous pouvez mettre à jour l'index:

git update-index --assume-unchanged /path/to/file

Ce faisant, les fichiers n'apparaîtront pas dans git statusou git diff.

Pour recommencer le suivi des fichiers, vous pouvez exécuter:

git update-index --no-assume-unchanged /path/to/file

5
C'est la meilleure réponse - elle se concentre uniquement sur le fichier unique, le fichier que vous ne souhaitez pas suivre par le référentiel. La réponse la plus marquée fonctionnera également, mais elle fait bien plus que simplement ignorer un fichier du suivi par git.
Chris Mejka

1
C'est une bonne. Mais si on tire? Y a-t-il des conflits de fusion?
pramod

@pramod, grande question. Je ne suis pas vraiment sûr. L'essayer dans un référentiel de test dépouillé?
Patrick James McDougle

15

Si vous avez ajouté votre .gitignorefichier trop tard, git continuera de suivre les fichiers déjà validés. Pour résoudre ce problème, vous pouvez toujours supprimer toutes les instances mises en cache des fichiers indésirables.

Tout d'abord, pour vérifier les fichiers que vous suivez réellement, vous pouvez exécuter:

git ls-tree --name-only --full-tree -r HEAD

Disons que vous avez trouvé des fichiers indésirables dans un répertoire comme cache/celui-ci, il est plus sûr de cibler ce répertoire au lieu de tous vos fichiers.

Donc au lieu de:

git rm -r --cached .

Il est plus sûr de cibler le fichier ou le répertoire indésirable:

git rm -r --cached cache/

Ensuite, ajoutez toutes les modifications,

git add .

et s'engager ...

git commit -m ".gitignore is now working"

Référence: https://amyetheredge.com/code/13.html


C'est la meilleure et claire réponse si vous souhaitez supprimer seulement quelques fichiers, pas l'intégralité du référentiel. Je vous lève mes pouces.
Apuig

2

Voici une façon de «décompresser» tous les fichiers qui seraient autrement ignorés sous l'ensemble actuel de modèles d'exclusion:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Cela laisse les fichiers dans votre répertoire de travail mais les supprime de l'index.

L'astuce utilisée ici est de fournir un fichier d'index inexistant à git ls-files afin qu'il pense qu'il n'y a pas de fichiers suivis. Le code shell ci-dessus demande tous les fichiers qui seraient ignorés si l'index était vide, puis les supprime de l'index réel avec git rm.

Une fois les fichiers «non suivis», utilisez git status pour vérifier que rien d'important n'a été supprimé (dans ce cas, ajustez vos modèles d'exclusion et utilisez git reset - chemin pour restaurer l'entrée d'index supprimée). Faites ensuite un nouveau commit qui laisse de côté le «crud».

Le «crud» sera toujours dans tous les vieux commits. Vous pouvez utiliser git filter-branch pour produire des versions propres des anciens commits si vous avez vraiment besoin d'un historique propre (nb en utilisant git filter-branch "réécrira l'historique", donc cela ne devrait pas être entrepris à la légère si vous avez des collaborateurs qui ont tiré n'importe lequel de vos engagements historiques après la première introduction du «crud»).


sonne comme une solution solide :) Je suppose que c'est pour le shell Linux non? malheureusement, je suis un utilisateur Win7. Est-ce que je peux faire ça sous Windows?
Tohid

0

Supprimer des fichiers de la zone de transit

git reset HEAD .

Ajouter toutes les modifications

git add .

Engagez-le:

git commit -m ".gitignore is now working"

-1

Je pense que c'est un moyen facile d'ajouter un fichier .gitignore à un référentiel existant.

Prérequis :

Vous avez besoin d'un navigateur pour accéder à votre compte github.

Pas

  1. Créez un nouveau fichier dans votre projet (existant) requis et nommez-le .gitignore . Vous obtiendrez une invite suggestive pour les modèles .gitignore dès que vous nommerez le fichier en tant que .gitignore . Utilisez ces modèles ou utilisez gitignore.io pour générer le contenu de votre fichier gitignore .
  2. Validez les modifications.
  3. Maintenant, clonez ce référentiel.

S'amuser!


-3

Utilisez git clean
Obtenir de l'aide sur cette course

git clean -h

Si vous voulez voir ce qui se passerait en premier, assurez-vous de passer le commutateur -n pour un essai à sec:

git clean -xn

Pour retirer les ordures gitingnored

git clean -xdf

Attention: vous ignorez peut-être les fichiers de configuration locaux comme database.yml qui seraient également supprimés. À utiliser à vos risques et périls.

ensuite

git add .
git commit -m ".gitignore is now working"
git push
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.