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?
9 réponses
pour Fichier unique:
git rm --cached mylogfile.log
Pour répertoire unique:
git rm --cached -r mydirectory
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.
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)
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/
selon ma réponse ici: /q/how-to-remove-a-directory-from-git-repository-56821/"Removed folder from repository" git push origin master
des mesures pour ignorer cela le dossier dans la prochaine commet
pour ignorer ce dossier de la prochaine commit, créer un fichier en racine nommé .gitignore et mets ce nom de dossier dedans. Vous pouvez mettre autant que vous voulez
.gitignore fichier sera ressembler à ceci
/FolderName
une solution plus générique:
-
Modifier "151900920 de fichier".
ECHO mylogfile.log >> .gitignore
-
supprimer tous les éléments de l'index.
git rm -r -f --cached .
-
Reconstruire l'index.
git add .
-
créer un nouveau commit
git commit -m "Removed mylogfile.log"
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.
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
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