Application de .gitignore aux fichiers validés

436

J'ai commis des charges de fichiers que je veux maintenant ignorer. Comment puis-je dire à git d'ignorer maintenant ces fichiers lors des futures validations?

EDIT: Je veux également les supprimer du référentiel. Ce sont des fichiers créés après la construction ou pour la prise en charge d'outils spécifiques à l'utilisateur.

user880954
la source
1
doublon possible du fichier .gitignore non ignoré
Wooble
8
@Wooble La réponse peut être similaire, mais cette question décrit exactement le problème auquel j'étais confronté et que je devais résoudre.
rjmunro
1
C'est la réponse qui répond directement à la question du titre avec des modifications minimes à votre
dépôt

Réponses:

472
  1. Modifier .gitignorepour correspondre au fichier que vous souhaitez ignorer
  2. git rm --cached /path/to/file

Voir également:

Matt Ball
la source
12
Il y a cependant beaucoup de fichiers. Je ne veux pas avoir à faire cela pour chacun
user880954
1
Les fichiers se trouvent-ils dans des répertoires communs? Sinon, le problème se réduit à une question d'utilisation du shell, pas à une question git.
Matt Ball
12
Il doit y avoir un mode «J'ai oublié d'ajouter mon .gitignore jusqu'à après mon commit initial».
Luke Puplett
9
La réponse est en dessous de celle-ci.
Lopsided
3
Il m'a demandé d'ajouter le drapeau -r pour pouvoir le faire.
Vishal Gulati
601

Après avoir modifié .gitignorepour faire correspondre les fichiers ignorés, vous pouvez faire git ls-files -ci --exclude-standardpour voir les fichiers qui sont inclus dans les listes d'exclusion; vous pouvez alors faire

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

pour les supprimer du référentiel (sans les supprimer du disque).

Modifier : vous pouvez également l'ajouter en tant qu'alias dans votre fichier .gitconfig afin de pouvoir l'exécuter à tout moment. Ajoutez simplement la ligne suivante sous la section [alias] (modifiez selon les besoins pour Windows ou Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(Le -r indicateur in xargsempêche git rmde s'exécuter sur un résultat vide et d'imprimer son message d'utilisation, mais peut uniquement être pris en charge par GNU findutils. D'autres versions de xargsmai ou peuvent ne pas avoir une option similaire.)

Maintenant, vous pouvez simplement taper git apply-gitignorevotre repo, et il fera le travail pour vous!

Jonathan Callen
la source
10
Je pense que xargs pour mac n'a pas -r ... ou le mien est buggé / vieux, je ne sais pas ... et pourquoi !avant git? eh bien ... le mien a travaillé comme alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino
18
Sous Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett
Cela vient de supprimer mes fichiers .gitignore, pas les fichiers que je voulais ignorer qui étaient répertoriés dans les fichiers .gitignore - était-ce le point?
Hippyjim
@Hippyjim si les fichiers sont déjà validés (même s'ils étaient répertoriés dans .gitignore), et .gitignore n'est pas encore validé , alors ce serait le résultat attendu, sinon, je ne suis pas sûr de ce qui se passe dans votre cas.
Jonathan Callen
1
Pour les utilisateurs de mac, -rc'est par défaut et n'est pas accepté par les versions BSD. Alors, enlevez -r.
Weishi Zeng
136

pour laisser le fichier dans le référentiel mais ignorer les modifications futures:

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

et pour annuler cela:

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

pour savoir quels fichiers ont été définis de cette façon:

git ls-files -v|grep '^h'

crédit pour la réponse originale à http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

ben.tiberius.avery
la source
1
Chronial a une excellente réponse pour le faire récursivement pour un répertoire: stackoverflow.com/a/16346756/1101076
jordan314
Je voulais valider une configuration IDE mais pas suivre les modifications inutiles. Cela fonctionne, bien que je ne sois pas sûr que cela fonctionnera pour les autres qui consultent le référentiel. Il peut être combiné avec git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedsi cela aide.
dlamblin
7
C'est la seule réponse qui fait précisément ce que demande la question du titre. PARFAIT! La plupart de ces autres réponses dérangeaient inutilement les fichiers.
kayleeFrye_onDeck
1
C'est exactement la bonne réponse à la question. L'utilisation de commandes comme git rm --cachedsupprimera le fichier dans le référentiel, ce qui ne répond pas au besoin de quizzer. Je vous remercie. J'apprécie vraiment cela. Votre réponse m'aide beaucoup.
ramwin
88

Assurez-vous que votre dépôt réel est la dernière version

  1. Modifiez .gitignorecomme vous le souhaitez
  2. git rm -r --cached .
  3. git add .

puis engagez comme d'habitude

Théo Attali
la source
14
Cela devrait être la réponse acceptée car la question indiquait spécifiquement qu'il y avait beaucoup de fichiers à supprimer.
nbeuchat
3
Notez que l'étape 2 peut prendre un certain temps si vous avez un grand référentiel.
brainbag
Cela a juste conduit à la suppression de tous les fichiers de l'index! Cela m'a sauvé: git reset HEAD(N'oubliez pas de cacher les modifications)
aksh1618
2
L'étape 2 supprime tout, oui, mais l'étape 3 devrait les lire tous, à l'exception de ceux qui échouent en raison de .gitignore.
ojchase le
11

Vieille question, mais certains d'entre nous sont en git-posh(PowerShell). Voici la solution pour cela:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
Chris Pfohl
la source
0

Suivez ces étapes:

  1. Ajouter un chemin au gitignorefichier

  2. Exécutez cette commande

    git rm -r --cached foldername
    
  3. valider les modifications comme d'habitude.

Kalyan Chakravarthi V
la source