Comment ignorer certains fichiers dans Git

731

J'ai un référentiel avec un fichier, Hello.java. Lorsque je le compile, un Hello.classfichier supplémentaire est généré.

J'ai créé une entrée pour Hello.classdans un .gitignorefichier. Cependant, le fichier semble toujours être suivi.

Comment puis-je faire ignorer Git Hello.class?

Kohan95
la source
8
Que voulez-vous dire "cela ne fonctionne pas"? Avez-vous peut-être déjà ajouté Hello.class à votre référentiel? les gitignores n'ont aucun effet sur le contenu déjà suivi. Voir par exemple stackoverflow.com/questions/1139762/gitignore-file-not-ignoring
Cascabel

Réponses:

810

Le problème est qu'il .gitignoreignore uniquement les fichiers qui n'ont pas été suivis auparavant (par git add). Exécutez git reset name_of_filepour décompresser le fichier et le conserver. Si vous souhaitez également supprimer le fichier donné du référentiel (après avoir poussé), utilisez git rm --cached name_of_file.

Ondrej Slinták
la source
190
La commande git rm --cached name_of_filesupprimera le fichier de votre dépôt git. Même si vous l'ajoutez à votre fichier .gitignore. Ce n'est pas ignorer que c'est supprimer.
OrwellHindenberg
4
Ce qui semble être ce que voulait OP dans ce cas.
Ondrej Slinták
40
Je suis content que votre solution ait fonctionné pour @ Kohan95! Bien que cette question doive être renommée en fonction de la réponse sélectionnée. Mes commentaires ne sont qu'un avertissement pour les développeurs qui ne savent peut-être pas ce que fait la commande.
OrwellHindenberg
91
git reset name_of_filesupprime le suivi et ne supprime pas le fichier.
Cees Timmerman
7
Tenté git rm --cached <nom_du_fichier> Il a supprimé le fichier dans le référentiel, mais comme il se trouvait dans le fichier .gitignore, la copie locale n'a pas été supprimée. En outre, pour ajouter un répertoire, vous devez le mettre avec une barre oblique de fin '/'. Je supprimais le répertoire de configuration de Rubymine dans un projet ruby ​​que quelqu'un avait archivé, qui était ".idea". Dans le fichier, je mets ".idea /" puis "git rm --cached -r .idea" pour supprimer le répertoire et tout ce qu'il contient (car git ne fait que versions des fichiers, pas des répertoires.)
Doug Noel
222

Comment ignorer de nouveaux fichiers

Globalement

Ajoutez le (s) chemin (s) à vos fichiers que vous souhaitez ignorer .gitignore(et validez-les). Ces entrées de fichier s'appliqueront également aux autres utilisateurs qui consultent le référentiel.

Localement

Ajoutez le (s) chemin (s) à vos fichiers que vous souhaitez ignorer dans votre .git/info/excludefichier. Ces entrées de fichier ne s'appliqueront qu'à votre copie de travail locale.

Comment ignorer les fichiers modifiés (temporairement)

Afin d'ignorer les fichiers modifiés pour être répertoriés comme modifiés, vous pouvez utiliser la commande git suivante:

git update-index --assume-unchanged <file>

Pour rétablir cette ignorance, utilisez la commande suivante:

git update-index --no-assume-unchanged <file>
Xman Classique
la source
Parfait pour empêcher un fichier contenant une clé API actuelle d'être poussé dans github!
Jim In Texas
1
@Xman Pourquoi avez-vous dit que c'était temporairement? J'ai fait les étapes que vous avez mentionnées pour localgit ignore, et j'ai redémarré mon système, cela montre toujours qu'il fonctionne directement propre.
Vivek Vardhan
1
Merci pour l' update-indexastuce, absolument parfaite pour éviter de changer un .gitignorefichier, qui est ensuite suivi par Git!
Thomas P.
@mcbjam Il n'y a pas de commande spéciale git ignore. Modifiez un fichier .gitignore situé à l'emplacement approprié dans la copie de travail. Vous devez ensuite ajouter ce .gitignore et le valider. Tous ceux qui clonent ce dépôt auront alors ignoré ces fichiers.
Xman Classical
@Vivek Vardhan git update-index --assume-unchanged est comme un masque temporaire sur l'index. Il restera en vigueur jusqu'à ce que vous le désactiviez. Pour clarifier mon propos, l'index initialement (c'est-à-dire juste après git read-tree) "contient" tous les fichiers de l'arborescence qui venait d'être lu. D'où ce qui fait que Git "ferme les yeux" une entrée d'index n'équivaut pas à la supprimer.
Xman Classical
150

Ajoutez la ligne suivante à .gitignore:

/Hello.class

Cela exclura Hello.class de git. Si vous l'avez déjà validé, exécutez la commande suivante:

git rm Hello.class

Si vous souhaitez exclure tous les fichiers de classe de git, ajoutez la ligne suivante à .gitignore:

*.class
Armand
la source
32
L'ajout Hello.classà .gitignoreignorera tout fichier appelé Hello.classdans n'importe quel sous-répertoire. Si vous avez l'intention d'ignorer uniquement le fichier Hello.classdans le même répertoire que le .gitignorefichier, utilisez /Hello.classplutôt une ligne.
ndim
Où mettez-vous le .gitignorefichier?
CodyBugstein
6
@Imray vous pouvez mettre .gitignoren'importe où dans un projet git - si un chemin commence par /, il sera relatif à l'emplacement du .gitignorefichier; sinon, il se référera récursivement aux fichiers du répertoire courant et de ses répertoires descendants.
Armand
109

1) Créez un .gitignorefichier. Pour ce faire, il vous suffit de créer un .txtfichier et de modifier l'extension comme suit:

Entrez la description de l'image ici

Ensuite, vous devez changer le nom, en écrivant la ligne suivante dans une fenêtre cmd:

 rename git.txt .gitignore

git.txtest le nom du fichier que vous venez de créer.

Ensuite, vous pouvez ouvrir le fichier et écrire tous les fichiers que vous ne souhaitez pas ajouter dans le référentiel. 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
~$*

Une fois que vous avez cela, vous devez l'ajouter à votre référentiel Git. Vous devez enregistrer le fichier où se trouve votre référentiel.

Ensuite, dans Git Bash, vous devez écrire la ligne suivante:

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

Si le référentiel existe déjà, vous devez procéder comme suit:

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

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

SomeAnonymousPerson
la source
Vous pouvez utiliser la commande "copy con .gitignore" dans l'invite, puis appuyez sur CTRL + Z pour créer directement le fichier sans l'Explorateur Windows.
heringer
61

Ignorer:

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

Pour annuler ignorer:

git update-index --no-assume-unchanged <path/to/file>
avj
la source
6
Je voudrais que ce soit en haut du tableau comme solution au problème .... C'est très simple et élégant
user1457958
"C'est très simple et élégant" - pas vraiment : 'Supposons-inchangé ne devrait pas être abusé pour un mécanisme d'ignorer. C'est "Je sais que mes opérations sur le système de fichiers sont lentes. Je promets à Git que je ne changerai pas ces chemins ..." Surtout, ce n'est pas une promesse ... que Git considérera toujours que ces chemins ne sont pas modifiés - si Git peut déterminer un chemin … A changé sans encourir de lstat(2)frais supplémentaires , il se réserve le droit de signaler que le chemin a été modifié (… git commit -aest libre de valider ce changement). »
Chris
47

Vous pouvez utiliser les méthodes ci-dessous pour ignorer / ne pas ignorer les modifications dans les fichiers suivis.

  1. Pour ignorer: git update-index --assume-unchanged <file>
  2. Pour rétablir les fichiers ignorés: git update-index --no-assume-unchanged <file>
kapillohakare
la source
4
Cela s'applique-t-il à tous les fichiers? Il est difficile de savoir comment ces commandes peuvent être appliquées à un seul fichier pour l'ignorer / le ignorer.
javadba
@kapil enfin !! quelque chose qui fonctionne réellement parmi un billion de variations de commande git! J'ai essayé chaque réponse pour ignorer certains fichiers build.xml stupides qui continuaient à apparaître après chaque génération ... merci!
killjoy
1
Veuillez ne pas le faire : 'Supposons-inchangé ne doit pas être abusé pour un mécanisme d'ignorer. C'est "Je sais que mes opérations sur le système de fichiers sont lentes. Je promets à Git que je ne changerai pas ces chemins ..." Surtout, ce n'est pas une promesse ... que Git considérera toujours que ces chemins ne sont pas modifiés - si Git peut déterminer un chemin … A changé sans encourir de lstat(2)frais supplémentaires , il se réserve le droit de signaler que le chemin a été modifié (… git commit -aest libre de valider ce changement). »
Chris
22

Créez un .gitignoredans le répertoire où se trouve .git. Vous pouvez y répertorier les fichiers séparés par une nouvelle ligne. Vous pouvez également utiliser des caractères génériques:

*.o
.*.swp
terminus
la source
3
Il est recommandé d'éviter de placer des modèles spécifiques à l'outil (c'est-à-dire vos fichiers Vim temporaires) dans des .gitignorefichiers (sauf si cet outil est mandaté par le projet). Vous pouvez mettre des modèles pour vos outils préférés dans votre fichier d'exclusion par utilisateur (ensemble core.excludesFile); ils fonctionneront dans tous vos référentiels. Par exemple git config --global core.excludesFile "$HOME/.git-user-excludes", puis mettez-les dans ce fichier.
Chris Johnsen
@Chris: Merci pour l'astuce. Mais je viens de l'écrire parce que rien de mieux ne m'est venu à l'esprit :)
terminus
1
@ChrisJohnsen «spécifique à l'outil?» pour vim ?? je pense qu'il est sûr d'exclure les fichiers d'échange de vim ..
javadba
16

Depuis le site officiel de GitHub:

Si vous avez déjà un fichier archivé et que vous souhaitez l'ignorer, Git n'ignorera pas le fichier si vous ajoutez une règle ultérieurement. Dans ces cas, vous devez d'abord dépister le fichier, en exécutant la commande suivante dans votre terminal:

git rm --cached FILENAME

ou

git rm --cached .
Mile Mijatović
la source
12

Vous devriez écrire quelque chose comme

*.class

dans votre .gitignorefichier.

KingCrunch
la source
4
@AgentZebra Vous devez ajouter une entrée *.classà votre .gitignorepour que git ignore tous les fichiers se terminant par .class.
KingCrunch
7

Ajoutez les fichiers que vous souhaitez ignorer dans le fichier .gitignore:

*.classe

*.projets

* .prefs

*.projet

Chinmoy
la source
5

Si vous avez déjà validé le fichier et que vous essayez de l'ignorer en l'ajoutant au .gitignorefichier, Git ne l'ignorera pas. Pour cela, vous devez d'abord faire les choses ci-dessous:

git rm --cached FILENAME

Si vous démarrez le projet et que vous souhaitez ajouter des fichiers à ignorer Git, suivez les étapes ci-dessous pour créer un fichier ignorer Git:

  1. Accédez à votre référentiel Git.
  2. Entrez "touch .gitignore" qui va créer un .gitignorefichier.
Savyasachi
la source
3

Vous pouvez également utiliser .gitattributes (au lieu de .gitignore) pour exclure des types de fichiers entiers. Le fichier est assez explicite, mais je colle le contenu ici pour référence. Faites attention à la dernière ligne (binaire * .class):

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.ico binary
*.mo binary
*.pdf binary
*.phar binary
*.class binary
David Niki
la source
2

Ajoutez la ligne suivante à .git / info / exclude:
Hello.class

Dado
la source
Êtes-vous censé changer des fichiers dans un dossier .git?
Peter Mortensen
Ce n'est peut-être pas une bonne idée de toucher ces fichiers sous .git manuellement.
mgyky
2

Cette page Web peut être utile et gagner du temps lorsque vous travaillez avec.gitignore .

Il génère automatiquement des fichiers .gitignore pour différents IDE et systèmes d'exploitation avec les fichiers / dossiers spécifiques que vous ne souhaitez généralement pas extraire vers votre référentiel Git (par exemple, les dossiers et fichiers de configuration spécifiques à l'IDE).

Jaime Caffarel
la source
1

J'ai essayé ça -

  1. liste des fichiers que nous voulons ignorer

git status .idea/xyz.xml .idea/pqr.iml Output .DS_Store

  1. Copiez le contenu de l'étape # 1 et ajoutez-le dans le fichier .gitignore.

echo " .idea/xyz.xml .idea/pqr.iml Output .DS_Store" >> .gitignore

  1. Valider

git status .gitignore

de même, nous pouvons ajouter un répertoire et tous ses sous-répertoires / fichiers que nous voulons ignorer en utilisant git directoryname/*et j'ai exécuté cette commande à partir du srcrépertoire.

VIPIN KUMAR
la source
1
  1. Accédez au fichier .gitignore et ajoutez l'entrée pour les fichiers que vous souhaitez ignorer
  2. Courir git rm -r --cached .
  3. Maintenant, lancez git add .
Rahul Garg
la source
0

J'ai essayé le --assume-unchangedet aussi le.gitignore mais ni l'un ni autre n'a bien fonctionné. Ils rendent difficile le changement de branche et la fusion des modifications des autres. Voici ma solution:

Lorsque je valide , je supprime manuellement les fichiers de la liste des modifications

Avant de tirer , je range les fichiers modifiés. Et après le pull, je fais un stash pop .

  1. git stash
  2. git pull
  3. git stash pop

L'étape 3 déclenche parfois une fusion et peut entraîner un conflit que vous devez résoudre, ce qui est une bonne chose.

Cela me permet de conserver les modifications locales qui ne sont pas partagées avec les autres membres de l'équipe.

John Henckel
la source