Question Comment faire pour Git "oublier" un fichier qui a été suivi mais est maintenant dans .gitignore?


Il y a un fichier qui était suivi par git, mais maintenant le fichier est sur le .gitignore liste.

Cependant, ce fichier continue à apparaître dans git status après il est édité. Comment forcez-vous git oublier complètement à ce sujet?


3645
2017-08-13 19:23


origine


Réponses:


.gitignore empêchera l'ajout de fichiers non-suivis (sans add -f) à l'ensemble des fichiers suivis par git, cependant git continuera à suivre tous les fichiers qui sont déjà suivis.

Pour arrêter le suivi d'un fichier, vous devez le supprimer de l'index. Cela peut être réalisé avec cette commande.

git rm --cached <file>

La suppression du fichier de la révision de la tête aura lieu lors de la prochaine validation.


3872
2017-08-13 20:40



La série de commandes ci-dessous va supprimer tous les éléments de l'index Git (pas du répertoire de travail ou du repo local), puis met à jour l'index Git, tout en respectant git ignore. PS. Index = Cache

Premier:

git rm -r --cached . 
git add .

Alors:

git commit -am "Remove ignored files"

1990
2017-09-30 13:51



git update-index fait le boulot pour moi:

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

Remarque: Cette solution est réellement indépendante sur .gitignore comme gitignore est seulement pour les fichiers non suivis.

modifier: Depuis que cette réponse a été postée, une nouvelle option a été créée et cela devrait être préféré. Tu devrais utiliser --skip-worktree qui est pour les fichiers suivis modifiés que l'utilisateur ne veut plus commettre et garder --assume-unchanged pour la performance pour empêcher git de vérifier l'état des gros fichiers suivis. Voir https://stackoverflow.com/a/13631525/717372 pour plus de détails...


739
2017-11-27 11:24



git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Cela prend la liste des fichiers ignorés et les supprime de l'index, puis valide les modifications.


217
2018-05-23 22:29



J'utilise toujours cette commande pour supprimer ces fichiers non suivis. Un-ligne, Unix-style, sortie propre:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Il répertorie tous vos fichiers ignorés, remplace chaque ligne de sortie par une ligne entre guillemets pour gérer les chemins avec des espaces à l'intérieur, et passe tout à git rm -r --cached pour supprimer les chemins / fichiers / répertoires de l'index.


59
2018-06-19 15:42



Si tu ne peux pas git rm un fichier suivi car d'autres personnes pourraient en avoir besoin (avertissement, même si toi  git rm --cached, quand quelqu'un d'autre obtient ce changement, leurs fichiers seront supprimés dans leur système de fichiers) s'il vous plaît regardez https://gist.github.com/1423106 pour les façons dont les gens ont travaillé autour du problème.


49
2017-07-19 00:08



déplacez-le, commettez-le, puis remettez-le en place. Cela a fonctionné pour moi dans le passé. Il y a probablement une manière "gittier" d'accomplir ceci.


43
2017-08-13 19:27



Qu'est-ce qui n'a pas marché pour moi

(Sous Linux), je voulais utiliser les messages ici suggérant la ls-files --ignored --exclude-standard | xargs git rm -r --cached approche. Cependant, (certains des) fichiers à supprimer comportaient une nouvelle ligne / LF /\n dans leurs noms. Aucune des solutions:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

faire face à cette situation (obtenir des erreurs sur les fichiers non trouvés).

Donc j'offre

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Cela utilise le -z argument à ls-fichiers, et le -0 argument à xargs répondre correctement / correctement aux caractères "méchants" dans les noms de fichiers.

Dans la page de manuel git-ls-files (1), il est dit:

Lorsque l'option -z n'est pas utilisée, les caractères TAB, LF et barre oblique inverse dans   Les chemins d'accès sont représentés par \ t, \ n et \\, respectivement.

donc je pense que ma solution est nécessaire si les noms de fichiers contiennent un de ces caractères.

EDIT: On m'a demandé d'ajouter que --- comme tout git rm commande --- cela doit être suivi d'un commettre pour rendre les déménagements permanents, par ex. git commit -am "Remove ignored files".


37
2017-12-29 12:50



J'ai accompli cela en utilisant git filtre-branche. La commande exacte que j'ai utilisée provient de la page man:

ATTENTION: cela va supprimer le fichier de votre histoire entière

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Cette commande va recréer tout l'historique des commit, en exécutant git rm avant chaque commit et ainsi se débarrasser du fichier spécifié. Ne pas oublier de sauvegarder avant d'exécuter la commande comme il volonté être perdu.


34
2017-08-13 19:35



Utilisez ceci quand:

1. Vous voulez débloquer beaucoup de fichiers, ou

2. Vous avez mis à jour votre fichier gitignore

Lien source:  http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Disons que vous avez déjà ajouté / validé quelques fichiers dans votre dépôt git et que vous les ajoutez ensuite à votre .gitignore; ces fichiers seront toujours présents dans votre index de référentiel. Cet article nous verrons comment s'en débarrasser.

Étape 1: Validez tous vos changements

Avant de poursuivre, assurez-vous que toutes vos modifications sont validées, y compris votre fichier .gitignore.

Étape 2: Tout supprimer du référentiel

Pour effacer votre dépôt, utilisez:

git rm -r --cached .
  • rm est la commande remove
  • -r permettra le retrait récursif
  • -cache ne supprimera que les fichiers de l'index. Vos fichiers seront toujours là.

le rm la commande peut être impitoyable. Si vous souhaitez essayer ce qu'il fait à l'avance, ajoutez le -n ou --dry-run drapeau pour tester les choses.

Étape 3: Re ajouter tout

git add .

Étape 4: Commit

git commit -m ".gitignore fix"

Votre référentiel est propre :)

Poussez les modifications sur votre télécommande pour voir les changements qui s'y appliquent également.


21
2018-04-22 18:11



  1. Mettez à jour votre .gitignore fichier - par exemple, ajouter un dossier que vous ne voulez pas suivre .gitignore.

  2. git rm -r --cached . - Supprimer tous les fichiers suivis, y compris voulu et non désiré. Votre code sera sûr tant que vous avez enregistré localement.

  3. git add . - Tous les fichiers seront rajoutés, sauf ceux dans .gitignore.


Chapeau à @AkiraYamamoto pour nous pointer dans la bonne direction.


18
2018-04-04 04:09