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/
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