3602 votes

Supprimer un fichier d'un dépôt Git sans le supprimer du système de fichiers local

Je veux supprimer un fichier de mon référentiel.

git rm file_to_remove.txt

supprimera le fichier du référentiel, mais il le supprimera également du système de fichiers local. Comment puis-je supprimer ce fichier du dépôt ? sans en supprimant ma copie locale du fichier ?

40 votes

Il est intéressant de noter que la réponse la plus votée est dangereuse pour certains. Si vous utilisez un dépôt distant, lorsque vous poussez votre dépôt local, vous devez retirer les fichiers que vous avez supprimés de git. SERA SUPPRIMÉ . Ce point est mentionné dans l'une des réponses mais n'est pas commenté.

1 votes

Pour le faire de la bonne façon : stackoverflow.com/questions/57418769/

5069voto

bdonlan Points 90068

En git rm La documentation indique :

Lorsque --cached est donné, le contenu mis en scène doit correspondre soit à l'extrémité de la branche, soit au fichier sur le disque, ce qui permet de retirer le fichier de l'index uniquement.

Donc, pour un seul fichier :

git rm --cached file_to_remove.txt

et pour un seul répertoire :

git rm --cached -r directory_to_remove

190 votes

On peut facilement passer à côté parce qu'il n'est pas aussi explicite que le texte de l'article. svn rm --keep-local .

132 votes

Mais comment préserver les fichiers sur les serveurs distants ? Je conserve mon fichier local, mais si je pousse et tire depuis un autre serveur, le fichier est supprimé. J'ai également ajouté un .gitignore pour le fichier, mais il est toujours supprimé.

12 votes

Cela supprime toujours les fichiers sur git pull si vous êtes derrière le commit après git rm

306voto

Sam Tyson Points 2322

Pour supprimer un dossier entier du repo (comme les fichiers de Resharper), procédez comme suit :

git rm -r --cached folderName

J'avais livré quelques fichiers resharper, et je ne voulais pas qu'ils persistent pour les autres utilisateurs du projet.

13 votes

Juste une note supplémentaire pour les futurs visiteurs : N'utilisez pas d'interface graphique pour "synchroniser" le commit avec le repo. Cela ramènerait les fichiers dans votre dépôt local. Vous devez faire un Git Push repo branch pour supprimer réellement les fichiers de la télécommande.

249voto

Techbrunch Points 278

Pour supprimer des fichiers du référentiel en fonction de .gitignore sans les effacer du système de fichiers local :

git rm --cached `git ls-files -i -X .gitignore`

Pour Windows Powershell :

git rm --cached $(git ls-files -i -X .gitignore)

8 votes

Cela ne fonctionne pas sous Windows. git ls-files -i -X .gitignore fonctionne, mais je ne sais pas comment envoyer les fichiers à 'git rm'. Savez-vous comment faire ?

18 votes

Fonctionne sous Windows si vous utilisez Git Bash au lieu de cmd-console

17 votes

J'adore ça. Cela a fonctionné sauf que j'avais quelques fichiers qui avaient des espaces dans le nom de fichier. J'ai modifié la solution ici en ceci : git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}" . Veuillez envisager de modifier ou d'ajouter cette solution à la réponse ici, car c'est un outil formidable à avoir...

80voto

mAsT3RpEE Points 449

Une solution plus générique :

  1. Modifier .gitignore fichier.

    echo mylogfile.log >> .gitignore

  2. Supprimer tous les éléments de l'index.

    git rm -r -f --cached .

  3. Indice de reconstruction.

    git add .

  4. Faire un nouveau commit

    git commit -m "Removed mylogfile.log"

3 votes

Cela supprimera-t-il réellement le fichier ?

6 votes

Depuis GitHub ? NON. Si vous avez déjà poussé sur github, cela ne le supprimera pas du site. Mais il mettra à jour votre dépôt git local.

6 votes

Le commentaire que vous avez supprimé était plus éliminé en fait :) Le problème avec la solution rm --cashed c'est qu'il finira par supprimer le fichier quand on le retirera - n'est-ce pas ? Et ce n'est pas ce que les gens veulent quand ils disent "Retirer un fichier du dépôt sans l'effacer du système de fichiers local ". Je ne sais pas pourquoi la solution ci-dessus a été acceptée - probablement que l'OP travaillait seul et n'a jamais tiré la sonnette d'alarme ? Je ne sais pas. Je comprends le problème de github "une fois poussé, toujours là" bien sûr.

77voto

BoD Points 3490

De plus, si vous avez commis des données sensibles (par exemple, un fichier contenant des mots de passe), vous devez le supprimer complètement de l'historique du référentiel. Voici un guide expliquant comment faire cela : http://help.github.com/remove-sensitive-data/

21 votes

Cette réponse devrait inclure les commandes requises pour accomplir cette tâche au lieu de renvoyer à un autre site web.

1 votes

Je voudrais également noter que j'ai trouvé que l'utilisation de la git bfg repo cleaner tool plus facile et plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X