web-dev-qa-db-fra.com

Supprimer un fichier d'un référentiel Git sans le supprimer du système de fichiers local

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?

2819
mveerman

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
4034
bdonlan

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.

263
Sam Tyson

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)
188
Techbrunch

Selon ma réponse ici: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Pour supprimer un dossier/répertoire ou un fichier uniquement du référentiel git et non du local, essayez 3 étapes simples.


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

remove directory

79
eirenaios

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/

67
BoD

Une solution plus générique:

  1. Éditez le fichier .gitignore.

    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. Faire un nouveau commit

    git commit -m "Removed mylogfile.log"

59
mAsT3RpEE

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.

22
Rystraum

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
11
Afraz Ahmad

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
6
Martijn Mellens