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
la source

9 ответов

pour Fichier unique:

git rm --cached mylogfile.log

Pour répertoire unique:

git rm --cached -r mydirectory
3587
répondu bdonlan 2018-03-19 02:51:30
la source

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 13:25:13
la source

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 20:42:47
la source

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 16:16:36
la source

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 15:42:32
la source

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 15:46:49
la source

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 16:59:01
la source

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 12:05:22
la source