web-dev-qa-db-fra.com

Comment puis-je supprimer un fichier de git repo?

J'ai ajouté un fichier nommé "file1.txt" à git repo. Après cela, je l’ai commis, j’ai ajouté quelques répertoires appelés dir1 et dir2, puis je les ai engagés dans git repo. 

Le référentiel actuel a maintenant "file1.txt", dir1 et dir2.
Comment puis-je supprimer "file1.txt" sans affecter d'autres personnes comme dir1 et dir2?

1537
webminal.org

Utilisez git rm :

git rm file1.txt
git commit -m "remove file1.txt"

Mais si vous souhaitez supprimer le fichier uniquement du référentiel Git et ne pas le supprimer du système de fichiers, utilisez: 

git rm --cached file1.txt
git commit -m "remove file1.txt"

Et pour pousser les changements au repo distant

git Push Origin branch_name  
2587
Greg Hewgill

git rm file.txt supprime le fichier du référentiel, mais le supprime également du système de fichiers local .

Pour supprimer le fichier du référentiel et pas le supprimer du système de fichiers local, utilisez:
git rm --cached file.txt

La situation exacte ci-dessous correspond à l’utilisation de git pour maintenir le contrôle de version du site Web de mon entreprise, mais le répertoire "mickey" était un dossier tmp permettant de partager du contenu privé avec un développeur CAD. Lorsqu'il a eu besoin de fichiers ÉNORMES, j'ai créé un répertoire privé non lié et les fichiers ftpd qu'il pouvait récupérer via un navigateur. Oubliant cela, j’ai ensuite effectué un git add -A à partir du répertoire de base du site Web. Par la suite, git status a montré les nouveaux fichiers devant être validés. Maintenant, je devais les supprimer du suivi de git et du contrôle de version ...

L'exemple de sortie ci-dessous provient de ce que je viens de vivre, où j'ai involontairement supprimé le fichier .003. Heureusement, je me fiche de ce qui est arrivé à la copie locale de .003, mais certains des autres fichiers actuellement modifiés étaient des mises à jour que je venais de créer sur le site Web et auraient été épiques d'avoir été supprimés sur le système de fichiers local! "Système de fichiers local" = le site Web actif (ce n'est pas une bonne pratique, mais une réalité) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Mise à jour: Cette réponse génère du trafic, alors j'ai pensé mentionner mon autre réponse de Git partage un couple d'excellents ressources: Cette page a un graphique qui aide à démystifier Git pour moi. Le le livre "Pro Git" est en ligne et m'aide beaucoup.

586
Chris K

Si votre fichier est déjà sur GitHub, vous maintenant (juillet 2013) pouvez le supprimer directement de l'interface graphique Web!

Il vous suffit de visualiser n’importe quel fichier de votre référentiel, de cliquer sur l’icône de la corbeille en haut et de valider la suppression, comme pour toute autre modification basée sur le Web.

delete button

(le commit va refléter la suppression de ce fichier):

commit a deletion

Et juste comme ça, il est parti.

Pour obtenir de l'aide sur ces fonctionnalités, veillez à lire nos articles d'aide sur les fichiers créer , déplacer , renommer et supprimer .

Remarque: comme il s’agit d’un système de contrôle de version, Git est toujours à votre disposition si vous souhaitez récupérer le fichier ultérieurement. 

La dernière phrase signifie que le fichier supprimé fait toujours partie de l'historique et que vous pouvez le restaurer assez facilement (mais pas encore via l'interface Web GitHub): 

Voir " Restaurer un fichier supprimé dans un dépôt Git ".

63
VonC

C'est la seule option qui a fonctionné pour moi.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Remarque: remplacez * .sql par votre nom de fichier ou votre type de fichier. Soyez très prudent, car cela passera par chaque commit et déchirera ce type de fichier. 

EDIT: Faites attention - après cette commande, vous ne pourrez plus pousser ou tirer - vous verrez le rejet de 'l'historique sans rapport' vous pouvez utiliser 'git Push --force -u Origin master' pour pousser ou tirer

47
Jason Glisson

De plus, s'il s'agit d'un dossier à supprimer et de ses dossiers ou fichiers enfants, utilisez:

git rm -r foldername
32
Raja

Plus généralement, git help aidera avec au moins des questions simples comme celle-ci:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index
23
James Polley

Si vous souhaitez supprimer le fichier du référentiel, mais le laisser dans le système de fichiers (ne sera pas suivi):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Si vous souhaitez supprimer le fichier du référentiel et du système de fichiers, il existe deux options:

  1. Si le fichier ne contient pas de modifications dans l'index: 

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Si le fichier a été modifié dans l'index: 

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
15
Aleksey Bykov

git rm ne supprimera que le fichier sur cette branche à partir de maintenant, mais il reste dans l'historique et git s'en souviendra.

La bonne façon de le faire est d'utiliser git filter-branch, comme d'autres l'ont mentionné ici. Il va réécrire chaque commit dans l'historique de la branche pour supprimer ce fichier.

Mais même après avoir fait cela, git peut s'en souvenir car il peut y avoir des références à cela dans reflog, télécommandes, balises, etc.

Si vous voulez effacer complètement en une étape, je vous recommande d'utiliser git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

C'est facile, il suffit de faire git forget-blob file1.txt.

Ceci supprimera toutes les références, fera git filter-branch et finalement exécutera le git garbage collector git gc pour éliminer complètement ce fichier dans votre référentiel.

12
nachoparker

Vous pouvez également supprimer le fichier de votre dossier local à l’aide de la commande rm, puis transmettre les modifications au serveur distant.

rm file1.txt

git commit -a -m "Deleting files"

git Push Origin master
9
Suhaib

Pour supprimer un fichier spécifique

nom de fichier git

Pour nettoyer tous les fichiers non suivis d'un répertoire de manière récursive en une seule fois

git clean -fdx

7
Sitesh

Si vous avez l'application GitHub pour Windows, vous pouvez supprimer un fichier en 5 étapes simples:

  • Cliquez sur Sync.
  • Cliquez sur le répertoire où se trouve le fichier et sélectionnez votre dernière version du fichier.
  • Cliquez sur Outils et sélectionnez "Ouvrir un shell ici".
  • Dans le shell, tapez: "rm {nom du fichier}" et appuyez sur Entrée.
  • Validez le changement et resynchronisez.
5
jushusted

Dans mon cas, j'ai essayé de supprimer le fichier sur github après quelques commits, mais enregistrer sur ordinateur

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git Push --force -u Origin master

et plus tard, ce fichier a été ignoré

5
OlegV

Remarque: si vous voulez supprimer le fichier uniquement de git, utilisez ci-dessous:

git rm --cached file1.txt

Si vous souhaitez également supprimer du disque dur:

git rm file1.txt

Si vous souhaitez supprimer un dossier (le dossier peut contenir quelques fichiers), vous devez le supprimer en utilisant la commande récursive, comme ci-dessous:

git rm -r foldername

Si vous souhaitez supprimer un dossier dans un autre dossier

git rm -r parentFolder/childFolder

Ensuite, vous pouvez commit et Push comme d'habitude. Cependant, si vous voulez récupérer le dossier supprimé, vous pouvez suivre ceci: récupérer les fichiers supprimés de git est possible.

De la doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

OPTIONS

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

peut avoir besoin de Shell leur échapper. Un nom de répertoire principal (par exemple, dir à Remove dir./Dir1/dir1 et fichier/2) peut être attribué pour supprimer tous les fichiers de. le répertoire, et récursivement tous les sous-répertoires, mais cela nécessite l'option -r à donner explicitement . -f--force

Override the up-to-date check.

-n--dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

-- 

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

options de ligne de commande) . --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q--quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

En savoir plus sur le doc officiel.

3
Blasanka
  1. Commencez par supprimer les fichiers du référentiel local.

    git rm -r nom de fichier

    ou, supprimer les fichiers uniquement du référentiel local mais du système de fichiers

    git rm --cached Nom de fichier

  2. Deuxièmement, validez les modifications dans le référentiel local.

    git commit -m "unwanted files or some inline comments"   
    
  3. Enfin, mettez à jour/insérez les modifications locales dans le référentiel distant.

    git Push 
    
3
Ajay

J'ai essayé beaucoup des options suggérées et aucune ne semblait fonctionner (je ne vais pas énumérer les différents problèmes). Ce que j'ai fini par faire, ce qui a fonctionné, était simple et intuitif (pour moi) était:

  1. déplacer tout le repo local ailleurs
  2. cloner à nouveau le repo du maître sur votre disque local
  3. recopiez les fichiers/dossiers de votre copie originale dans # 1 dans le nouveau clone de # 2
  4. assurez-vous que le gros fichier ne soit pas présent ou exclu dans le fichier .gitignore.
  5. faire l'habituel git add/git commit/git Push
2
jacanterbury

Après avoir supprimé le fichier du référentiel avec git rm, vous pouvez utiliser BFG Repo-Cleaner pour effacer complètement et facilement le fichier de l'historique du référentiel.

0
glisu

J'ai des fichiers obj et bin qui ont accidentellement été insérés dans le référentiel et qui ne veulent pas polluer ma liste de 'fichiers modifiés'

Après j'ai remarqué qu'ils sont allés à la télécommande, je les ai ignorés en ajoutant ceci à .gitignore

/*/obj
/*/bin

Le problème, c’est qu’ils sont déjà dans la télécommande et qu’ils sont modifiés, ils apparaissent et polluent la liste des fichiers modifiés. 

Pour ne plus les voir, vous devez supprimer tout le dossier du référentiel distant.

Dans une invite de commande:

  1. CD dans le dossier repo (i.e. C:\repos\MyRepo)
  2. Je veux supprimer SSIS\obj. Il semble que vous ne puissiez supprimer que le plus haut niveau. Vous devez maintenant créer un CD dans SSIS: (c.-à-d. C:\repos\MyRepo\SSIS
  3. Maintenant, tapez l'incantation magique git rm -r -f obj
    • rm = remove
    • -r = supprime récursivement
    • -f = signifie force, parce que tu le penses vraiment
    • obj est le dossier
  4. Maintenant, lancez git commit -m "remove obj folder"

J'ai reçu un message alarmant disant/ 13 fichiers modifiés 315222 suppressions

Puis, parce que je ne voulais pas avoir à chercher la ligne CMD, je suis allé dans Visual Sstudio et j'ai fait une synchronisation pour l'appliquer à la télécommande.

0
Nick.McDermaid