Comment faire en sorte que Git "oublie" un fichier qui a été suivi, mais est maintenant dans .gitignore?

Il y a un fichier qui est suivi par git , mais maintenant le fichier est dans la liste .gitignore .

Cependant, ce fichier continue à être affiché dans l' git status après l'avoir édité. Comment faites-vous git complètement oublier à ce sujet?

4082
13 авг. mettre Ivan 13 août. 2009-08-13 22:23 '09 à 10:23 2009-08-13 22:23
@ 22 réponses

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

Pour arrêter de suivre un fichier, vous devez le supprimer de l'index. Ceci peut être réalisé en utilisant cette commande.

 git rm --cached <file> 

La suppression d'un fichier de l'en-tête de révision aura lieu à la prochaine validation.

REMARQUE: Bien que cela ne supprime pas le fichier physique de votre fichier local, il supprimera les fichiers des ordinateurs d'autres développeurs lors du prochain git pull .

4329
13 авг. Réponse donnée par CB Bailey 13 août 2009-08-13 23:40 '09 à 23h40 2009-08-13 23:40

Dans la séquence de commandes ci-dessous, tous les éléments de l'index Git seront supprimés (et non du répertoire de travail ou du référentiel local), puis l'index Git sera mis à jour, tandis que Git sera ignoré. Ps. Index = Cache

Tout d'abord:

 git rm -r --cached . git add . 
border=0

Puis:

 git commit -am "Remove ignored files" 
2209
30 сент. La réponse est donnée par Matt Frear 30 sep . 2013-09-30 16:51 '13 à 16:51 2013-09-30 16:51

git update-index fait tout le travail pour moi:

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

Note Cette solution est pratiquement indépendante de .gitignore car gitignore n’est destiné qu’aux fichiers non suivis.

change: depuis que cette réponse a été publiée, une nouvelle option a été créée et il convient de la préférer. Vous devez utiliser --skip-worktree qui est destiné aux fichiers surveillés modifiés que l'utilisateur ne veut plus corriger, et enregistre --assume-unchanged pour de meilleures performances, de sorte que git ne vérifie pas le statut des fichiers surveillés volumineux. Voir recomed.site.site/questions/1817 / ... pour plus d'informations ...

 git update-index --skip-worktree <file> 
830
27 нояб. la réponse est donnée à Konstantin le 27 novembre. 2013-11-27 14:24 13 à 14:24 2013-11-27 14:24
 git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached git commit -am "Remove ignored files" 

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

237
24 мая '14 в 1:29 2014-05-24 01:29 La réponse est donnée le 24 mai 2014 à 13:29 2014-05-24 01:29

J'utilise toujours cette commande pour supprimer ces fichiers illisibles. Sortie simple, style Unix, propre:

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

Il répertorie tous vos fichiers ignorés, remplacés par une ligne avec des guillemets au lieu de chaque ligne de sortie pour traiter les chemins contenant des espaces et tout transférer à git rm -r --cached pour supprimer les chemins / fichiers / répertoires de l'index.

62
19 июня '15 в 18:42 2015-06-19 18:42 La réponse a été donnée par David Hernandez le 19 juin 2015 à 18h42. 2015-06-19 18:42

Si vous ne pouvez pas git rm fichier surveillé parce que d'autres personnes peuvent en avoir besoin (un avertissement, même si vous appuyez sur git rm --cached quand une autre personne reçoit cette modification, ses fichiers seront supprimés dans leur système de fichiers). Cela se produit souvent en raison du remplacement du fichier de configuration, des informations d'authentification, etc. Consultez le site https://gist.github.com/1423106 pour connaître les moyens utilisés pour contourner le problème.

Pour résumer:

  • Demandez à votre application de trouver le fichier config-overide.ini manquant et utilisez-le sur le fichier config.ini capturé (ou trouvez ~ / .config / myapp.ini ou $ MYCONFIGFILE).
  • Corrigez le fichier config-sample.ini et ignorez le fichier config.ini. Si nécessaire, créez un script ou un fichier similaire à copier.
  • Essayez d’utiliser la magie clean / smudge de gitattributes pour appliquer et supprimer les modifications, par exemple, brouiller le fichier de configuration en tant qu’extrait d’une branche alternative et effacer le fichier de configuration en tant qu’extrait de HEAD. C'est une chose difficile, je ne le recommande pas pour un utilisateur novice.
  • Enregistrez le fichier de configuration dans sa branche de déploiement dédiée, qui ne sera jamais fusionnée avec le maître. Lorsque vous souhaitez déployer / compiler / test, vous fusionnez avec cette branche et vous obtenez ce fichier. Il s’agit essentiellement d’une approche de nettoyage / nettoyage, à l’exception de l’utilisation de stratégies de fusion de personnes et de modules git supplémentaires.
  • Anti-recommandation: n'utilisez pas d'hypothèses sans modifications, cela ne se terminera que par des larmes (car un faux mensonge en soi peut conduire à de mauvaises choses, telles que vos modifications seront perdues à jamais).
53
19 июля '12 в 3:08 2012-07-19 03:08 La réponse est donnée par Seth Robertson le 19 juillet 12 à 3:08 2012-07-19 03:08

déplacez-le, verrouillez-le, puis renvoyez-le. Cela a fonctionné pour moi dans le passé. Il y a probablement un moyen pour Gittier de le faire.

51
13 авг. Réponse donnée par Joel Hooks 13 août 2009-08-13 22:27 '09 à 22h27 2009-08-13 22:27

Utilisez ceci quand:

1. Vous voulez formater 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/

Supposons que vous ayez déjà ajouté / transféré des fichiers dans votre référentiel git, puis que vous les ayez ajoutés à votre.gitignore; ces fichiers seront toujours présents dans votre index de référentiel. Dans cet article, nous verrons comment nous en débarrasser.

Étape 1: Validez toutes vos modifications.

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

Étape 2. Supprimez tout du référentiel.

Pour effacer votre repo, utilisez:

 git rm -r --cached . 
  • rm - commande delete
  • -r permettra la suppression récursive
  • -Cache ne supprimera que les fichiers de l'index. Vos fichiers seront toujours là.

La commande rm peut être implacable. Si vous voulez essayer ce qu'il fait à l'avance, ajoutez -n ou --dry-run pour tout vérifier.

Étape 3: Ajouter tout

 git add . 

Étape 4: réparer

 git commit -m ".gitignore fix" 

Votre dépôt est propre :)

Cliquez sur les modifications sur la télécommande pour voir les modifications qui sont également effectives.

40
22 апр. Réponse donnée par Dheeraj Bhaskar le 22 avril 2018-04-22 21:11 '18 à 21h11 2018-04-22 21:11

Ce qui n'a pas fonctionné pour moi

(Sous Linux) Je voulais utiliser des messages suggérant l’ ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached . Cependant, certains des fichiers à supprimer avaient des caractères de nouvelle ligne / LF / \n incorporés 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).

Par conséquent, je suggère

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

Il utilise l'argument -z pour les fichiers ls et l'argument -0 utilise xargs pour une utilisation sûre / correcte des caractères "méchants" dans les noms de fichiers.

La page de manuel git-ws-files (1) indique:

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

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

EDIT: On m'a demandé d'ajouter que --- comme toute commande de git rm - il doit être suivi de commit pour rendre la suppression permanente, par exemple. git commit -am "Remove ignored files" .

38
29 дек. La réponse est donnée par JonBrave le 29 décembre. 2015-12-29 15:50 16 à 15:50 2015-12-29 15:50

Je l'ai fait en utilisant la branche git du filtre . La commande exacte que j'ai utilisée provient de la page de manuel:

ATTENTION : cela supprimera le fichier de tout l'historique.

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

Cette commande recrée l'intégralité de l'historique de validation en exécutant git rm avant chaque validation et élimine ainsi le fichier spécifié. N'oubliez pas d'effectuer une sauvegarde avant d'exécuter la commande, car elle sera perdue.

35
13 авг. la réponse est donnée le 13 août. 2009-08-13 22:35 '09 à 10:35 2009-08-13 22:35
  • Mettez à jour le fichier .gitignore - par exemple, ajoutez un dossier dans lequel vous ne souhaitez pas effectuer le suivi. .gitignore .

  • git rm -r --cached . - supprimer tous les fichiers suivis, y compris les fichiers non désirés et non désirés. Votre code sera en sécurité si vous l'avez enregistré localement.

  • git add . - Tous les fichiers seront rajoutés, à l'exception de ceux spécifiés dans .gitignore .


Astuce @AkiraYamamoto chapeaux pour pointer dans la bonne direction.

18
04 апр. la réponse est donnée Chen_Wayne 04 apr. 2016-04-04 07:09 '16 à 7:09 2016-04-04 07:09

Je pense que, peut-être, git ne peut pas complètement oublier le fichier à cause de son concept ( la section "Images, pas la différence" ).

Ce problème est manquant, par exemple, lors de l'utilisation de CVS. CVS stocke les informations sous forme de liste de modifications basée sur des fichiers. Les informations pour CVS sont un ensemble de fichiers et de modifications apportées à chaque fichier au fil du temps.

Mais en général, chaque fois que vous enregistrez ou enregistrez l'état de votre projet, il prend en principe une photo de tous vos fichiers et stocke un lien vers cet instantané. Ainsi, si vous avez ajouté un fichier une fois, il est toujours sera présent dans cet instantané.

Ces 2 articles m'ont été utiles:

git suppose-pas de changement vs skip-worktree et Comment ignorer les changements dans les fichiers suivis en utilisant git

Sur cette base, je fais ce qui suit si le fichier est déjà suivi:

 git update-index --skip-worktree <file> 

À partir de ce moment, toutes les modifications locales dans ce fichier seront ignorées et ne seront pas supprimées. Si le fichier est changé en fichier distant, un conflit se produira lorsque git pull . Stop ne fonctionnera pas. Pour résoudre le problème, copiez le contenu du fichier dans un endroit sûr et procédez comme suit:

 git update-index --no-skip-worktree <file> git stash git pull 

Le contenu du fichier sera remplacé par le contenu supprimé. Collez vos modifications depuis un emplacement sûr vers le fichier et exécutez à nouveau:

 git update-index --skip-worktree <file> 

Si tout le monde qui travaille avec le projet exécute git update-index --skip-worktree <file> , pull ne devrait pas poser de problème d' pull . Cette solution convient aux fichiers de configuration lorsque chaque développeur a sa propre configuration de projet.

Ce n’est pas très pratique à faire chaque fois qu’un fichier a été modifié sur un ordinateur distant, mais cela peut éviter qu’il ne soit écrasé par le contenu distant.

12
21 мая '17 в 18:12 2017-05-21 18:12 la réponse est donnée Boolean_Type 21 mai '17 à 6:12 2017-05-05 18:12

Copier / coller une réponse: git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status git rm --cached -r.; git add.; git status

Cette commande ignorera les fichiers déjà transférés dans le référentiel Git, mais nous les avons maintenant ajoutés à .gitignore .

5
19 нояб. La réponse est donnée par youhans le 19 novembre. 2018-11-19 14:21 '18 à 14h21 2018-11-19 14:21

La réponse de Matt Fear était l'IMHO le plus efficace. Ce qui suit est juste un script PowerShell pour ceux qui, sous Windows uniquement, suppriment des fichiers de leur référentiel git, ce qui correspond à leur liste d'exceptions.

 # Get files matching exclusionsfrom .gitignore # Excluding comments and empty lines $ignoreFiles = gc .gitignore | ?{$_ -notmatch "#"} | ?{$_ -match "\S"} | % { $ignore = "*" + $_ + "*" (gci -r -i $ignore).FullName } $ignoreFiles = $ignoreFiles| ?{$_ -match "\S"} # Remove each of these file from Git $ignoreFiles | % { git rm $_} git add . 
5
25 дек. La réponse est donnée par Ameer Deen le 25 décembre. 2013-12-25 03:51 '13 à 3:51 2013-12-25 03:51

Déplacez ou copiez le fichier dans un endroit sûr afin de ne pas le perdre. Ensuite, git file et commit. Le fichier sera affiché si vous revenez à l'une de ces validations précédentes, ou à une autre branche où il n'a pas été supprimé. Cependant, dans tous les commits futurs, vous ne verrez plus le fichier. Si le fichier doit être ignoré, vous pouvez le replacer dans le dossier, et git ne le verra pas.

5
13 авг. Réponse donnée par Apreche 13 août 2009-08-13 22:27 '09 à 22h27 2009-08-13 22:27

Effectuez les étapes suivantes en alternance, tout ira bien.

1. Supprimez les fichiers ajoutés par erreur du répertoire / référentiel . Vous pouvez utiliser la commande "rm -r" (pour Linux) ou les supprimer en parcourant les répertoires.

2.ajouter des fichiers / répertoires dans le fichier gitignore et enregistrez-le.

3. Maintenant, supprimez- les du cache git en utilisant ces commandes (s'il y a plusieurs répertoires, supprimez-les un par un, en réexécutant cette commande).

 git rm -r --cached path-to-those-files 

4. Maintenant , validez et appuyez sur , utilisez ces commandes. Cela supprimera ces fichiers du git distant et empêchera git de les suivre.

 git add . git commit -m "removed unnecessary files from git" git push origin 
3
20 сент. La réponse est donnée par Shamsul Arefin Sajib le 20 septembre. 2018-09-20 13:52 '18 à 13h52: 2018-09-20 13:52

BFG est spécialement conçu pour supprimer les données non souhaitées, telles que les fichiers volumineux ou les mots de passe des référentiels Git. Il comporte donc un simple indicateur qui supprime les fichiers historiques volumineux (ne figurant pas dans votre fichier actuel): "-strip-blobs-more-than"

 $ java -jar bfg.jar --strip-blobs-bigger-than 100M 

Si vous voulez spécifier les fichiers par leur nom, vous pouvez également le faire:

 $ java -jar bfg.jar --delete-files *.mp4 

BFG est 10-1000 fois plus rapide que la branche de filtre Git et est généralement beaucoup plus facile à utiliser - consultez les instructions pour une utilisation complète et des exemples pour plus de détails.

Source: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3
03 сент. Réponse donnée par Meir Gerenstadt le 03 sept. 2017-09-03 15:37 '17 à 15h37 2017-09-03 15:37

J'ai aimé la réponse de JonBrave, mais j'ai des répertoires de travail assez sales qui corrigent -a, ça me fait un peu peur, alors c'est ce que j'ai fait:

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage.gitignore git commit -m "nouveau gitignore et supprime les fichiers ignorés de l'index"

destruction:

 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached git ls-files -z --ignored --exclude-standard | xargs -0 git stage git stage .gitignore git commit -m "new gitignore and remove ignored files from index" 
  • supprimer les fichiers ignorés de l'index
  • Stage.gitignore et les fichiers que vous venez de supprimer.
  • s'engager
2
08 авг. La réponse est donnée par Jay Irvine le 08 août. 2018-08-08 23:49 '18 à 23h49: 2018-08-08 23:49

Si vous ne souhaitez pas utiliser l'interface de ligne de commande et travailler avec Windows, une solution très simple consiste à utiliser TortoiseGit . L'action "Supprimer (enregistrer en local)" dans le menu convient parfaitement.

2
15 марта '18 в 14:04 2018-03-15 14:04 La réponse est donnée par Pedi T., le 15 mars 18 à 14h04 . 2018-03-15 14h04

Ce n'est plus un problème dans le dernier git (v2.17.1 au moment de l'écriture).

Dans .gitignore ignore les fichiers suivis, mais supprimés. Vous pouvez le vérifier vous-même en exécutant le script suivant. L'expression finale du git status devrait indiquer "ne rien faire".

 # Create empty repo mkdir gitignore-test cd gitignore-test git init # Create a file and commit it echo "hello" > file git add file git commit -m initial # Add the file to gitignore and commit echo "file" > .gitignore git add .gitignore git commit -m gitignore # Remove the file and commit git rm file git commit -m "removed file" # Reintroduce the file and check status. # .gitignore is now respected - status reports "nothing to commit". echo "hello" > file git status 
1
13 июня '18 в 19:21 2018-06-13 19:21 La réponse a été donnée par Lloyd le 13 juin 18 à 19h21. 2018-06-13 19:21

Dans le cas d'un DS_Store déjà engagé:

 find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch 

Ignore les:

 echo ".DS_Store" >> ~/.gitignore_global echo "._.DS_Store" >> ~/.gitignore_global echo "**/.DS_Store" >> ~/.gitignore_global echo "**/._.DS_Store" >> ~/.gitignore_global git config --global core.excludesfile ~/.gitignore_global 

Enfin, faites un correctif!

0
23 апр. la réponse est donnée par user7718859 le 23 avril . 2018-04-23 00:14 '18 à 0:14 2018-04-23 00:14

Sur mac:

 $ git --version git version 2.6.4 $ uname -a Darwin MUSRV186016-382 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

1. Supprimez les fichiers DS_Store de la liste des fichiers suivis par git dans la branche foo:

 $ for file in $(git ls-tree -r foo --name-only | grep -i DS_Store); do git rm --cached $file; done 

2. S'engager:

 $ git commit -m "Removed .DS_Store files" 

3. Vérifiez que les fichiers ne sont plus suivis.

 $ git ls-tree -r foo --name-only # There should not be anything coming back 

4. Cliquez pour les supprimer de la console:

 $ git push 
-5
13 янв. Réponse donnée par Raphvanns le 13 janvier 2017-01-13 22:53 '17 à 10:53 2017-01-13 22:53

Autres questions sur les tags ou Posez une question