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

Ma propagation initiale contenait des fichiers journaux. J'ai ajouté *log à mon .gitignore , et maintenant je veux supprimer les fichiers journaux de mon dépôt.

git rm mylogfile.log

supprimera un fichier du dépôt, mais le supprimera aussi du système de fichiers local.

Comment puis-je supprimer ce fichier de la pension sans supprimer ma copie locale du fichier?

2499
demandé sur Brian Tompsett - 汤莱恩 2009-07-17 18:56:43

9 réponses

pour Fichier unique:

git rm --cached mylogfile.log

Pour répertoire unique:

git rm --cached -r mydirectory
3587
répondu bdonlan 2018-03-18 23:51:30

pour supprimer un dossier complet du repo( comme les fichiers Resharper), faites ceci:

git rm -r --cached folderName

j'avais engagé quelques fichiers resharper, et je ne voulais pas que ceux-ci persistent pour d'autres utilisateurs du projet.

253
répondu Sam Tyson 2012-10-02 09:25:13

vous pouvez également supprimer des fichiers du dépôt basé sur votre .gitignore sans les supprimer du système de fichiers local :

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

ou, alternativement, sur Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)
168
répondu Techbrunch 2017-12-06 17:42:47

en outre, si vous avez Commité des données sensibles (par exemple un fichier contenant des mots de passe), vous devriez le supprimer complètement de l'histoire du dépôt. Voici un guide expliquant comment faire: http://help.github.com/remove-sensitive-data/

65
répondu BoD 2011-08-21 12:16:36

une solution plus générique:

  1. Modifier "151900920 de fichier".

    ECHO mylogfile.log >> .gitignore

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

    git rm -r -f --cached .

  3. Reconstruire l'index.

    git add .

  4. créer un nouveau commit

    git commit -m "Removed mylogfile.log"

55
répondu mAsT3RpEE 2013-12-13 11:42:32

Git permet d'ignorer ces fichiers en supposant qu'ils sont inchangés. Ce est fait en exécutant la commande git update-index --assume-unchanged path/to/file.txt . Une fois le marquage d'un fichier en tant que tel, git complètement ignorer les modifications sur ce fichier; ils ne sera pas affiché lorsque le statut git ou la différence git, et ils ne seront jamais commis.

(de https://help.github.com/articles/ignoring-files )

donc, ne pas le supprimer, mais en ignorant les modifications à lui pour toujours. Je pense que cela ne fonctionne que localement, de sorte que les collègues peuvent encore voir des changements à moins qu'ils n'exécutent la même commande que ci-dessus. (Encore le besoin de vérifier cela.)

Note: Ceci ne répond pas directement à la question, mais est basé sur des questions de suivi dans les commentaires des autres réponses.

18
répondu Rystraum 2014-01-28 11:46:49

ci-dessus les réponses n'ont pas fonctionné pour moi. J'ai utilisé filter-branch pour supprimer tous les fichiers engagés

supprimer un fichier d'un dépôt git avec:

git filter-branch --tree-filter 'rm  file'

supprimer un dossier d'un dépôt git avec:

git filter-branch --tree-filter 'rm -rf directory'

cela supprime le répertoire ou le fichier de toutes les propagations

vous pouvez spécifier une propagation en utilisant:

git filter-branch --tree-filter 'rm -rf directory' HEAD

ou une gamme

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

afin De pousser tout à distance, vous pouvez le faire:

git push origin master --force
5
répondu Martijn Mellens 2016-01-12 13:59:01

si vous voulez simplement déverrouiller un fichier et ne pas supprimer du local et à distance repo puis utiliser cette commande:

git update-index --assume-unchanged  file_name_with_path
4
répondu Afraz Ahmad 2018-09-07 09:05:22