Suppression de plusieurs fichiers d'un dépôt Git qui ont déjà été supprimés du disque

1311

J'ai un dépôt Git que j'ai supprimé quatre fichiers de l'utilisation rm( pas git rm ), et mon statut Git ressemble à ceci:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

Comment puis-je supprimer ces fichiers de Git sans avoir à parcourir manuellement et ajouter chaque fichier comme ceci:

git rm file1 file2 file3 file4

Idéalement, je recherche quelque chose qui fonctionne de la même manière que git add .si cela est possible.

Codebeef
la source
10
@seth, ce n'est pas toujours pratique à utiliser git rm, la suppression pourrait avoir été effectuée à partir d'un outil distinct, d'un IDE ou d'un gestionnaire de fichiers. Visual Studio pour un peut être pénible lors de la suppression / du renommage de fichiers.
Brett Ryan
67
Ugh, demander pourquoi quelqu'un n'utilise pas, git rmc'est un peu comme demander pourquoi il n'utilise pas git vimou git cd. C'est une chose stupide à faire, et git devrait avoir une commande ou un alias intégré pour supprimer les fichiers supprimés du staging, et vous ne devriez pas avoir à le rechercher sur SO ou à lire les pages de manuel pendant votre pause déjeuner.
WCWedin
7
La réponse de Varinder n'est pas un bon moyen. Considérez git add -u comme l'a suggéré Cody et qui est également la réponse à cette question: stackoverflow.com/questions/1402776/…
Roland

Réponses:

2300

Pour Git 1.x

$ git add -u

Cela indique à git de mettre automatiquement en scène les fichiers suivis - y compris la suppression des fichiers précédemment suivis.

Pour Git 2.0

Pour mettre en scène tout votre arbre de travail:

$ git add -u :/

Pour mettre en scène uniquement le chemin actuel:

$ git add -u .
carl
la source
133
Notez que cela ajoutera tous les fichiers modifiés et suivis - supprimés et mis à jour.
Ian Hunter
19
@beanland, il vous suffit de fournir le chemin d'accès au fichier spécifique que vous souhaitez modifier si vous ne voulez pas qu'il les obtienne tous. par exemple git add -u [chemin]
Paul Prewett
27
également git add -u folder/pour exécuter cette opération dans un dossier
c ..
2
Pour info: cette réponse a fusionné de stackoverflow.com/questions/1402776/…
Shog9
1
C'est peut-être la question que les gens se posaient lorsqu'ils sont arrivés sur cette page, et c'est peut-être ce que le PO voulait réellement poser, mais cela ne répond pas à la question exacte posée.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

pourrait être ce que vous cherchez .. cela fonctionne pour moi ..

Varinder
la source
5
pour Windows, essayez d'ajouter l'alias suivant dans votre configuration sans les guillemets comme indiqué ci-dessus par Evan Moran 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS
21
méfiez-vous des fichiers avec des espaces en leur nom
maazza
44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u comme l'a suggéré Cody est un moyen beaucoup plus simple et plus sûr, sans risque de supprimer accidentellement des fichiers.
Roland
4
Dévaluer cela car c'est la mauvaise réponse même si cela peut fonctionner pour certains fichiers. utilisez "git add -u" ci-dessous. C'est pour ça.
n13
733

Vous pouvez utiliser

git add -u

Pour ajouter les fichiers supprimés à la zone de transit, puis validez-les

git commit -m "Deleted files manually"
Cody Caughlan
la source
101
Veuillez noter l'utilisateur de Google: il ajoute également les fichiers de suivi modifiés à la zone de transit.
erenon
4
Exécutez cette commande uniquement si vous venez de supprimer les fichiers et souhaitez les mettre en scène immédiatement.
Aryo
1
je ne suis pas en mesure de supprimer le fichier du dépôt bitbucket]
srinivas gowda
356

Si vous exécutez simplement:

git add -u

git mettra à jour son index pour savoir que les fichiers que vous avez supprimés devraient en fait faire partie du prochain commit. Ensuite, vous pouvez exécuter "git commit" pour enregistrer ce changement.

Ou, si vous exécutez:

git commit -a

Il prendra automatiquement ces modifications (et toutes autres) et les validera.

Mise à jour : si vous souhaitez uniquement ajouter des fichiers supprimés, essayez:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Sit
la source
1
À droite, git commit -afera ce que je veux, sauf que dans certains cas, j'ai des fichiers que je ne veux pas valider, donc je veux préparer le commit manuellement.
Igor Zevaka
2
commit -a fait essentiellement un "add -u" en premier; il mettra à jour l'index avec toutes les modifications apportées aux fichiers connus (qu'il s'agisse de suppressions ou de simples modifications). Vous pouvez bien sûr être plus précis et ajouter / rm uniquement les fichiers que vous souhaitez. git.or.cz/gitwiki/… peut être utile.
Emil Sit
2
Le jeu de commandes sous "Update: .." fonctionnait comme un charme. Merci!
Jay Taylor
10
Merci beaucoup pour 'git ls-files --deleted | xargs git rm '!
mit
18
"git ls-files --deleted | xargs git rm" est la bonne réponse! Merci!
reto
166

Vous recherchez probablement -A:

git add -A

ceci est similaire à git add -u, mais ajoute également de nouveaux fichiers. C'est à peu près l'équivalent de la addremovecommande de hg (bien que la détection de mouvement soit automatique).

Dustin
la source
8
Sur une note rapide, l'utilisation de -u limite l'ajout aux fichiers suivis et -a inclura également les fichiers non suivis. Je pensais juste souligner la différence.
spaaarky21
À ce stade, vous pouvez tout aussi bien ajouter tout via le drapeau commit -a.
Zac Grierson
94

Pour mettre en scène uniquement les fichiers supprimés :

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

Ou (à la manière des xargs):

git status | awk '/deleted/ {print $2}' | xargs git rm

Vous pouvez alias votre jeu de commandes préféré pour une utilisation ultérieure pratique.

Saeb Amini
la source
2
@Saeb Comprendre la file d'attente, mais il xargsfaut environ 15 minutes pour maîtriser.
Eric Wilson
11
git status | awk '/deleted/ {print $3}' | xargs git rmserait un moyen plus court de le faire. grep | awk... Just Say No.
Mark Reed
58
git rm $(git ls-files --deleted)n'est-ce pas plus pratique (copié à partir de cela ).
Hotschke
1
xargs ou la substitution $ () ci-dessus si vous savez que la liste n'est pas énorme. Si la liste est énorme: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
@Andrew xargsest probablement plus efficace qu'une boucle while pour une énorme liste, car il passe plus d'un argument à chaque exécution git rm. Pour limiter le nombre d'arguments transmis à git rmchaque exécution, utilisez l' -noption:git ls-files --deleted | xargs -n 15 git rm
Ajedi32
61
git rm test.txt

Avant ou après avoir supprimé le fichier réel.

Peaker
la source
7
Bien que cela fonctionne, je me retrouve souvent à supprimer une tonne de fichiers juste rmet à le regretter plus tard.
carl
4
Pourquoi est-ce pire que de le faire git add -u? Il semble qu'il serait plus sûr d'ajouter les fichiers spécifiques qui ont été supprimés au commit, plutôt que d'ajouter TOUTES les modifications.
Ian Dunn
2
en fait, cela devrait être la meilleure réponse selon la dernière ligne de la question "Je veux juste une commande qui supprime tous les fichiers de git qui sont également supprimés du disque."
Ramsharan
2
@Ramsharan non, car il ne fait rien du tout. Cela supprime un seul fichier; l'OP a SPÉCIFIQUEMENT demandé "tous" les fichiers supprimés.
Adam
1
@Ramsharan non, c'est le point - dans presque tous les cas, vous NE POUVEZ PAS simplement utiliser un caractère générique (il n'y a pas de caractère générique qui correspondra). C'est pourquoi la réponse principale est tellement plus compliquée.
Adam
49

En utilisant git-add avec les options '--all' ou '--update' vous pouvez obtenir plus que vous ne le vouliez. Des fichiers nouveaux et / ou modifiés seront également ajoutés à l'index. J'ai une configuration d'alias bash pour quand je veux supprimer des fichiers supprimés de git sans toucher à d'autres fichiers:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

Tous les fichiers qui ont été supprimés du système de fichiers sont ajoutés à l'index lorsqu'ils sont supprimés.

zobie
la source
39

Ce n'est pas vraiment important, mais je ne suis pas d'accord avec la réponse choisie:

git add -u 

... supprimera les fichiers de l'index si les fichiers correspondants dans l'arborescence de travail ont été supprimés, mais il mettra également en scène le nouveau contenu modifié des fichiers suivis.

git rm $(git ls-files --deleted)

... d'autre part ne rm que les fichiers supprimés qui ont été suivis.

Donc, ce dernier est à mon avis la meilleure option.

Stephan Tual
la source
29

Si ce sont les seuls changements, vous pouvez simplement faire

git commit -a

pour valider toutes les modifications. Cela comprendra les fichiers supprimés.

SpoonMeiser
la source
3
Je ne sais pas pourquoi j'ai été rejeté; git fait un bon travail d'identification des fichiers qui ont été supprimés, même si vous ne l'avez pas dit explicitement en utilisant git rm.
SpoonMeiser
Vous avez obtenu un vote négatif parce que "-a" n'est pas un commutateur acceptable, c'est "-A". Modification de votre réponse.
Sheharyar
10
Non, "-a" est un commutateur acceptable, car la commande est commit . "-A" est un commutateur à ajouter mais pas à valider . Je constate que la modification suggérée a déjà été rejetée.
SpoonMeiser
Dans le cas où la seule chose que vous commettez est le fichier supprimé, ajoutez le commutateur --allow-empty
billrichards
euh, en fait --allow-empty n'est nécessaire que si vous avez fait git rm --cached
billrichards
20
git ls-files --deleted | xargs git rm 

est la meilleure option pour ajouter uniquement des fichiers supprimés.

Voici quelques autres options.

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
Sijo Kurian
la source
16

git add -u

-u --update Correspond uniquement aux fichiers déjà suivis dans l'index plutôt qu'à l'arborescence de travail. Cela signifie qu'il ne mettra jamais en scène de nouveaux fichiers, mais qu'il mettra en scène les nouveaux contenus modifiés des fichiers suivis et qu'il supprimera les fichiers de l'index si les fichiers correspondants dans l'arborescence de travail ont été supprimés.

Si non est donné, par défaut à "."; en d'autres termes, mettez à jour tous les fichiers suivis dans le répertoire actuel et ses sous-répertoires.

Obay
la source
La réponse la plus votée dit déjà d'utiliser git add -u. D'où viennent tous les autres éléments de votre réponse, la documentation? Vous devez créer un lien vers la documentation et la citer dans le cas contraire.
TheWarriorNamedFoo
14

Cette solution simple fonctionne bien pour moi:

git rm $(git ls-files --deleted)
Houssem Badri
la source
Je pense que vous devriez toujours utiliser git shell sur votre répertoire de travail actuel
Houssem Badri
2
C'est agréable et simple mais ne fonctionne pas avec les dossiers récursifs.
DrB
@BehnazChangizi Je pense que oui, stackoverflow.com/questions/1054044/…
Houssem Badri
@PvdL les espaces non acceptés dans le chemin sont un problème spécifique à l'os
Houssem Badri
11

Si vous souhaitez l'ajouter à votre, .gitconfigprocédez comme suit:

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

Il ne vous reste plus qu'à exécuter:

git rma
Evan Moran
la source
1
et de la ligne cmdgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey
9
git ls-files --deleted -z | xargs -0 git rm --cached

Cela supprimera tous les fichiers supprimés qui ont été suivis précédemment par git, ainsi que le cas où vos noms de fichiers contiennent des espaces.

En fonction de votre variante POSIX, vous devrez peut-être utiliser xargs -0 -r: cela entraînera la xargsfermeture progressive du contenu nul canalisé.

EDIT: --cachedet les --deleteddrapeaux sont utilisés en tandem pour éviter la suppression accidentelle de fichiers qui n'ont pas déjà été supprimés.

Murphy Danger
la source
7

Dites à la commande de mettre automatiquement en scène les fichiers qui ont été modifiés et supprimés, mais les nouveaux fichiers dont vous n'avez pas parlé à Git ne sont pas affectés:

-a
--all

git add . && git commit -m -a "Your commit"

ou

git add --all && git commit -m "Your commit"
ilgam
la source
1
git add --all && git commit -m "Votre commit" Cela a fonctionné pour moi dans windows-7, en utilisant le shell de commande Git bash.
kmarabet
1
La commande suivante a fonctionné pour moi dans Windows-7, en utilisant le shell de commande Git bash: $ git add --all && git commit -m "remove property files" [master 58c41ac] remove property files 1 fichier modifié, 9 suppressions (-). .. Ensuite, pour pousser ces modifications validées dans le référentiel distant, exécutez: $ git push origin .. Comptage des objets: 10, terminé.
kmarabet
6

Les éléments suivants fonctionneront, même si vous avez beaucoup de fichiers à traiter:

git ls-files --deleted | xargs git rm

Vous voudrez probablement aussi vous engager avec un commentaire.

Pour plus de détails, voir: Scripts Git utiles

l3x
la source
6

Veuillez utiliser -tpour voir quelle commande est réellement exécutée

Je viens de modifier la réponse de Virender pour faire de même:

git ls-files --deleted -z | xargs -t -0 git rm
Venkateswara Rao
la source
5

Aucun des drapeaux à git-add ne mettra en scène que les fichiers supprimés; si tout ce que vous avez modifié sont des fichiers supprimés, alors tout va bien, mais sinon, vous devez exécuter git-status et analyser la sortie.

En partant de la réponse de Jeremy, voici ce que j'ai obtenu:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Obtenez l'état des fichiers.
  2. Pour les fichiers supprimés, isolez le nom du fichier.
  3. Supprimez toutes les lignes commençant par #, ainsi qu'une ligne d'état contenant le mot «supprimé»; Je ne me souviens pas exactement de quoi il s'agissait et il n'est plus là, vous devrez donc peut-être le modifier pour différentes situations. Je pense que le regroupement d'expressions pourrait être une fonctionnalité spécifique à GNU, donc si vous n'utilisez pas gnutils, vous devrez peut-être ajouter plusieurs grep -vlignes.
  4. Passez les fichiers à git rm.

Coller cela dans un alias de shell maintenant ...

Xiong Chiamiov
la source
5

Comme mentionné

git add -u

étapes les fichiers supprimés pour la suppression, MAIS AUSSI les fichiers modifiés pour la mise à jour.

Pour décompresser les fichiers modifiés, vous pouvez le faire

git reset HEAD <path>

si vous aimez garder vos commits organisés et propres.
REMARQUE: cela pourrait également supprimer les fichiers supprimés, donc soyez prudent avec ces caractères génériques.

DarkNeuron
la source
4
git commit -m 'commit msg' $(git ls-files --deleted)

Cela a fonctionné pour moi après avoir déjà supprimé les fichiers.

Tchad
la source
3

J'avais besoin du même bouton et j'ai utilisé le bouton "stage change". il ajoute également tout.

Et après que "l'étape ait changé", j'ai fait "commit" ...

donc mon répertoire de travail est à nouveau propre.

Serdar
la source
Bien utiliser un gui, c'est tricher, lol! Mais plus vite dans les cas où le concepteur GUI a couvert vos besoins. Il est bon de savoir bricoler avec «ce qui est sous le capot».
Dennis
1
Pour info: cette réponse a fusionné de stackoverflow.com/questions/1402776/…
Shog9
3
git rm $(git ls-files -d)

Supprime tous les fichiers répertoriés par la git ls-filescommande (-d affiche uniquement les fichiers supprimés). Ne fonctionne pas pour les fichiers avec des espaces dans le nom de fichier ou le chemin d'accès, mais simple à retenir

A. Albershteyn
la source
2

Vous pouvez utiliser git add -u <filenames>pour mettre en scène les fichiers supprimés uniquement.

Par exemple, si vous avez supprimé les fichiers templates/*.tpl, utilisez git add -u templates/*.tpl.

Le -uest requis pour faire référence aux fichiers qui existent dans le référentiel mais qui n'existent plus dans le répertoire de travail. Sinon, la valeur par défaut git addest de rechercher les fichiers dans le répertoire de travail et si vous spécifiez des fichiers que vous avez supprimés, il ne les trouvera pas.

thomasrutter
la source
2

Ajout d'alias système pour le transfert des fichiers supprimés en tant que commande rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

LES FENÊTRES doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Remarque

Windows doit avoir bashinstallé.

Haris Krajina
la source
2

(Encore une autre variation)

Je voulais supprimer tous les fichiers déjà supprimés du disque, mais d'un dossier spécifique, en laissant les autres dossiers intacts. Ce qui suit a fonctionné pour moi:

git ls-files --deleted  | grep <folder-name> | xargs git rm
Urbain
la source
1

quelque chose comme

git status | sed -s "s/^.*deleted: //" | xargs git rm 

peut le faire.

Jeremy French
la source
2019 git version 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841
1

Pour projet de studio visuel

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

ce qui est utile lorsque le chemin du fichier supprimé a de l'espace

Scieur
la source
-1

La solution la plus flexible que j'ai trouvée à ce jour consiste à

git cola

Et sélectionnez tous les fichiers supprimés que je veux mettre en scène.

(Notez que je fais généralement tout en ligne de commande dans git, mais git gère les fichiers supprimés un peu maladroitement).

Broes De Cat
la source
Les caractères génériques ne fonctionnaient pas pour moi git add -u path/to/my/deleted-files-pattern-*.yml, c'était donc la meilleure réponse pour moi (ne voulant pas mettre en scène tous les fichiers supprimés, mais 50 sur quelques centaines).
mlncn