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
?
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
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.
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.
(le commit va refléter la suppression de ce fichier):
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):
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
De plus, s'il s'agit d'un dossier à supprimer et de ses dossiers ou fichiers enfants, utilisez:
git rm -r foldername
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
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:
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"
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"
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
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.
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
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
Si vous avez l'application GitHub pour Windows, vous pouvez supprimer un fichier en 5 étapes simples:
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é
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.
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
Deuxièmement, validez les modifications dans le référentiel local.
git commit -m "unwanted files or some inline comments"
Enfin, mettez à jour/insérez les modifications locales dans le référentiel distant.
git Push
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:
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.
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:
C:\repos\MyRepo
)C:\repos\MyRepo\SSIS
) git rm -r -f obj
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.