Mon commit initial contenait des fichiers de log. J'ai ajouté *log
à mon .gitignore
, et je souhaite maintenant supprimer les fichiers journaux de mon référentiel.
git rm mylogfile.log
supprimera un fichier du référentiel, mais le supprimera également du système de fichiers local.
Comment puis-je supprimer ce fichier du référentiel sans supprimer ma copie locale du fichier?
Depuis le man file :
Lorsque
--cached
est donné, le contenu mis en scène doit correspondre à la pointe de la branche ou au fichier sur le disque, ce qui permet de supprimer le fichier uniquement de l'index.
Donc, pour un seul fichier:
git rm --cached mylogfile.log
et pour un seul répertoire:
git rm --cached -r mydirectory
Pour supprimer un dossier entier du référentiel (comme des fichiers Resharper), procédez comme suit:
git rm -r --cached folderName
J'avais commis des fichiers resharper et je ne voulais pas que ceux-ci persistent pour les autres utilisateurs du projet.
Vous pouvez également supprimer des fichiers du référentiel 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)
Selon ma réponse ici: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository
Procédure pour supprimer le répertoire
git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git Push Origin master
Étapes à suivre pour ignorer ce dossier lors des prochains commits
Pour ignorer ce dossier des commits suivants, créez un fichier à la racine nommé . Gitignore et entrez le nom de ce dossier. Vous pouvez en mettre autant que vous voulez
. Le fichier gitignore ressemblera à ceci
/FolderName
De même, si vous avez validé des données sensibles (un fichier contenant des mots de passe, par exemple), vous devez les supprimer complètement de l’historique du référentiel. Voici un guide expliquant comment faire cela: http://help.github.com/remove-sensitive-data/
Une solution plus générique:
Éditez le fichier .gitignore
.
ECHO mylogfile.log >> .gitignore
Supprimer tous les éléments de l'index.
git rm -r -f --cached .
Reconstruire l'index.
git add .
Faire un nouveau commit
git commit -m "Removed mylogfile.log"
Git vous permet d'ignorer ces fichiers en supposant qu'ils sont inchangés. Ceci est effectué en exécutant la commande
git update-index --assume-unchanged path/to/file.txt
. Une fois que le fichier est marqué comme tel, git ignorera complètement toutes les modifications apportées à ce fichier; ils ne s'afficheront pas lors de l'exécution de git status ou de git diff, ni ne seront jamais validés.
(De https://help.github.com/articles/ignoring-files )
Par conséquent, ne pas le supprimer, mais ignorer les modifications qui y sont apportées pour toujours. Je pense que cela ne fonctionne que localement, de sorte que les collègues peuvent toujours voir les modifications apportées à moins d'exécuter la même commande que ci-dessus. (Encore besoin de vérifier cela cependant.)
Remarque: ceci ne répond pas directement à la question, mais repose sur des questions complémentaires dans les commentaires des autres réponses.
Si vous voulez simplement extraire un fichier et ne pas le supprimer des dépôts locaux et distants, utilisez cette commande:
git update-index --assume-unchanged file_name_with_path
Les réponses ci-dessus n'ont pas fonctionné pour moi. J'ai utilisé filter-branch
pour supprimer tous les fichiers validé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 tous les commits.
Vous pouvez spécifier un commit 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
Pour tout pousser à distance, vous pouvez faire:
git Push Origin master --force