web-dev-qa-db-fra.com

Ignorer les fichiers déjà validés dans un référentiel Git

J'ai un référentiel Git déjà initialisé auquel j'ai ajouté un fichier .gitignore. Comment puis-je actualiser l'index de fichiers afin que les fichiers que je veux ignorer soient ignorés?

2391
trobrock

Pour extraire un fichier unique déjà ajouté/initialisé dans votre référentiel, , c'est-à-dire , arrête de suivre le fichier mais ne le supprime pas de ton système utilise: git rm --cached filename

Pour désarchiver tous les fichiers qui se trouvent maintenant dans votre .gitignore:

Commencez par valider toutes les modifications de code en attente, puis exécutez la commande suivante:

git rm -r --cached .

Cela supprime tous les fichiers modifiés de l'index (zone intermédiaire), puis lance simplement:

git add .

Engagez-le:

git commit -m ".gitignore is now working"

Pour annuler git rm --cached filename, utilisez git add filename.

Assurez-vous de valider toutes vos modifications importantes avant d'exécuter git add . Sinon vous perdrez toutes les modifications apportées aux autres fichiers.

3958
trobrock

Si vous essayez d'ignorer les modifications apportées à un fichier déjà suivi dans le référentiel (par exemple, un fichier dev.properties que vous auriez besoin de modifier pour votre environnement local mais que vous ne voudriez jamais archiver ces modifications), procédez comme vous le souhaitez. est:

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

Si vous voulez recommencer à suivre les modifications

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

Voir git-update-index (1) Page de manuel .

Jetez également un coup d’œil aux options skip-worktree et no-skip-worktree pour update-index si vous avez besoin que cela persiste après un git-reset ( via )


Mise à jour: Puisque les gens le demandent, voici un alias pratique (et mis à jour depuis commenté ci-dessous) pour voir quels fichiers sont actuellement "ignorés" (--assume-unchanged) dans votre espace de travail local

$ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]"
567
dyodji

Pour extraire un fichier qui a déjà été ajouté/initialisé dans votre référentiel, c’est-à-dire arrêter de le suivre, mais ne pas le supprimer de votre système, utilisez: git rm --cached filename

356
pagetribe

Oui - .gitignore le système ignore uniquement les fichiers ne se trouvant pas sous contrôle de version de git.

C'est à dire. Si vous avez déjà ajouté un fichier appelé test.txt à l'aide de git-add, ajouter test.txt à .gitignore entraînera toujours le suivi des modifications apportées à test.txt.

Vous devez d’abord git rm test.txt et valider ce changement. Alors seulement, les modifications apportées à test.txt seront ignorées.

81
Antony Stubbs

Supprimer les espaces finaux dans .gitignore

Assurez-vous également que votre .gitignore ne contient aucun espace de fin. Je me suis posé cette question parce que je cherchais une réponse, puis j’ai eu l’impression amusante d’ouvrir le rédacteur en chef au lieu de simplement féliciter. Suppression d'un seul espace supplémentaire à la fin et poof cela fonctionne maintenant :)

50
MikeJansen

j'ai suivi ces étapes

git rm -r --cached .
git add .
git reset HEAD

ensuite, git supprimera tous les fichiers (* .swp dans mon cas) qui devraient être ignorés.

39
Orlando

Si vous souhaitez arrêter le suivi du fichier sans le supprimer de votre système local, ce que je préfère pour ignorer le fichier config/database.yml. Essayez simplement:

git rm --cached config/database.yml
# this will delete your file from git history but not from your local system.

ajoutez maintenant ce fichier au fichier .gitignore et validez les modifications. Et à partir de maintenant, toutes les modifications apportées à config/database.yml ne seront pas suivies par git.

$ echo config/database.yml >> .gitignore

Merci

36
przbadu

Des réponses complexes partout!

Il suffit d'utiliser le suivant

git rm -r --cached .

Il supprimera les fichiers que vous essayez d'ignorer de l'origine et non du maître de votre ordinateur!

Après cela, il suffit de commettre et Push!

30
Ahmad Awais

Pour ne supprimer que quelques fichiers spécifiques du suivi:

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

Si jamais vous voulez recommencer à le suivre:

git update-index --no-assume-unchanged path/to/file                      
28
Mark Salvatore

Comme le dit dav_i, pour conserver le fichier dans le référentiel tout en le supprimant des modifications sans créer de commit supplémentaire, vous pouvez utiliser:

git update-index --assume-unchanged filename
27
Iman Mohamadi

Ne sachant pas très bien ce que faisait la commande 'réponse', je l'ai exécutée, à mon grand désarroi. Il supprime récursivement tous les fichiers de votre dépôt Git.

Stackoverflow à la rescousse ... Comment inverser un "git rm -r."?

git reset HEAD

Fait le truc, puisque j'avais des fichiers locaux non validés que je ne voulais pas écraser.

23
averydev

Aucune des réponses n'a fonctionné pour moi.

Au lieu:

  1. Déplacez le fichier hors du répertoire contrôlé par git
  2. Vérifiez le retrait dans git
  3. Replacez le fichier dans le répertoire contrôlé par git

Après avoir déplacé le fichier, git l'ignorera.

Fonctionne aussi avec les répertoires!

22
Hunter S

Il y a peut-être une autre suggestion pour les types lents comme moi =) Mettez le fichier . Gitignore dans la racine de votre référentiel not dans le dossier . Git. À votre santé!

22
Olga

un autre problème que j'ai eu était que j'ai placé un commentaire en ligne.

tmp/*   # ignore my tmp folder (this doesn't work)

cela marche

# ignore my tmp folder
tmp/
19
kindahero

Si les fichiers sont déjà sous contrôle de version, vous devez les supprimer manuellement.

18
Aragorn

Grâce à votre réponse, j'ai pu écrire ce petit one-liner pour l'améliorer. Je l'ai couru sur mon .gitignore et repo, et n'ai eu aucun problème, mais si quelqu'un voit des problèmes criants, s'il vous plaît commenter. Ceci devrait git rm -r --cached de .gitignore:

cat $ (git rev-parse --show-toplevel) /. gitIgnore | sed "s // $ //" | grep -v "^ #" | xargs -L 1 -I {} trouver $ (git rev-parse --show-toplevel) -name "{}" | xargs -L 1 git rm -r --cached

Notez que vous aurez beaucoup de fatal: pathspec '<pathspec>' did not match any files. C'est juste pour les fichiers qui n'ont pas été modifiés.

12
umop

Un autre problème non mentionné ici est que si vous avez créé votre .gitignore dans le bloc-notes Windows, il peut ressembler à du charabia sur d'autres plateformes, comme je l'ai découvert. La clé est de vous assurer que l'encodage est défini sur ANSI dans le bloc-notes (ou créez le fichier sous Linux comme je l'ai fait).

De ma réponse ici: https://stackoverflow.com/a/11451916/406592

9
Matt Parkins

J'ai trouvé un problème étrange avec .gitignore. Tout était en place et semblait correct. La seule raison pour laquelle mon .gitignore a été "ignoré" était que la fin de ligne était au format Mac (\ r). Donc, après avoir sauvegardé le fichier avec la fin de ligne correcte (dans vi using: set ff = unix), tout a fonctionné comme un charme!

9
Johannes Vetter

Sur mon serveur serveur Linux (pas vrai sur mon mac dev dev), les répertoires sont ignorés tant que je n'ajoute pas d'astérisque:

www/archives/*

Je ne sais pas pourquoi mais ça m'a fait perdre quelques heures, alors je voulais partager ...

7
ndemoreau

Si vous devez arrêter de suivre beaucoup de fichiers ignorés, vous pouvez combiner certaines commandes:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

Cela arrêterait de suivre les fichiers ignorés. Si vous souhaitez réellement supprimer des fichiers du système de fichiers, n'utilisez pas l'option --cached. Vous pouvez également spécifier un dossier pour limiter la recherche, tel que:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm

6
Etherealone

Une chose à garder également à l'esprit si .gitignore ne semble pas ignorer les fichiers non suivis, c'est que vous ne devriez pas avoir de commentaires sur la même ligne que les ignorés. Donc ça va

# ignore all foo.txt, foo.markdown, foo.dat, etc.
foo*

Mais cela ne fonctionnera pas:

foo*   # ignore all foo.txt, foo.markdown, foo.dat, etc.

.gitignore interprète ce dernier cas comme "ignorer les fichiers nommés "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc.", que vous n’avez bien sûr pas.".

6
Gabriel Perdue