.gitignore après validation


210

J'ai un référentiel git hébergé sur Github. Après avoir commis de nombreux fichiers, je me rends compte que je dois créer .gitignoreet d' exclure .exe, les .objfichiers.

Cependant, supprimera-t-il automatiquement ces fichiers validés du référentiel? Y a-t-il un moyen de forcer cela?


6
Les futurs googleurs pourraient trouver cela extrêmement utile. Succinct et précis: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

Réponses:


331

Non, vous ne pouvez pas forcer la suppression d'un fichier déjà validé dans le référentiel simplement parce qu'il est ajouté au .gitignore

Vous devez git rm --cachedsupprimer les fichiers dont vous ne voulez pas dans le dépôt. (--cached puisque vous voulez probablement garder la copie locale mais la retirer du repo.) Donc si vous voulez supprimer tous les exe de votre repo

git rm --cached /\*.exe

(Notez que l'astérisque * est cité à partir du shell - cela permet à git, et non au shell, d'étendre les chemins d'accès des fichiers et des sous-répertoires)


6
@Madhur Ahuja En fait, si vous le faites git rm /\*.exe, tous les exe seront supprimés dans votre
dépôt

4
À quoi servent les / \?
Costa

5
@Costa, ils sont là pour échapper à l'astérisque, pour empêcher le shell de l'interpréter comme il est destiné git.
Lambart

2
Attention: Les fichiers sont conservés en local, c'est vrai ... Mais les autres utilisateurs exécutant un git pullverront leurs fichiers supprimés.
ByScripts

42

Cependant, supprimera-t-il automatiquement ces fichiers validés du référentiel?

Non. Même avec un .gitignorefichier existant, vous pouvez mettre en scène des fichiers "ignorés" avec le -fdrapeau (forcer). Si ces fichiers sont déjà validés, ils ne sont pas supprimés automatiquement.

git rm --cached path/to/ignored.exe

Est-ce à dire que j'ai supprimé individuellement chaque .exe
Madhur Ahuja

Vous êtes probablement en mesure de regrouper cela, mais je ne sais pas comment cela fonctionne sous Windows
KingCrunch

30

Si vous n'avez pas encore poussé les modifications:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push

15

J'ai dû supprimer .idea et les dossiers cibles et après avoir lu tous les commentaires, cela a fonctionné pour moi:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

puis pousser pour maîtriser


.ideaétait mon problème, je suppose que c'était aussi le vôtre:)
Olivier Pons

5

Cependant, supprimera-t-il automatiquement ces fichiers validés du référentiel?

Non.

La «meilleure» recette pour ce faire est d'utiliser git filter-branchcomme écrit ici:

La page de manuel de git-filter-branch contient des exemples complets.

Remarque Vous allez réécrire l'historique. Si vous aviez publié des révisions contenant les fichiers ajoutés accidentellement, cela pourrait créer des problèmes pour les utilisateurs de ces branches publiques. Informez-les ou pensez à quel point vous avez besoin de supprimer les fichiers.

Remarque En présence de balises, utilisez toujours l' --tag-name-filter catoption pour git filter-branch. Cela ne fait jamais de mal et vous évitera le mal de tête lorsque vous réaliserez plus tard que vous en avez besoin


J'ai exécuté cette commande, elle a montré Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) AVERTISSEMENT: Ref 'refs / heads / master' est inchangé et rien ne s'est passé
Madhur Ahuja

Il s'agit d'un avertissement et signifie très probablement que la branche principale ne contient pas (encore) de révisions avec les fichiers à supprimer. Vous pouvez facilement vérifier cela. En cas de problème, veuillez mettre à jour la question. PS: utilisez - --allpour réécrire toutes les branches (locales) à la fois
sehe

1

Même après avoir supprimé le (s) fichier (s) puis validé, vous aurez toujours ces fichiers dans l'historique. Pour les supprimer, pensez à utiliser BFG Repo-Cleaner . C'est une alternative à git-filter-branch.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.