web-dev-qa-db-fra.com

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

Dans un dépôt Git, j'ai supprimé quatre fichiers en utilisant 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 à passer 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.

1259
Codebeef

Pour Git 1.x

$ git add -u

Cela indique à git de placer automatiquement les fichiers suivis, y compris la suppression des fichiers déjà suivis. 

Pour Git 2.0

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

$ git add -u :/

Pour ne mettre en scène que le chemin actuel:

$ git add -u .
2247
carl
git ls-files --deleted -z | xargs -0 git rm 

pourrait être ce que vous cherchez .. ça marche pour moi .. 

1342
Varinder

Vous pouvez utiliser 

git add -u

Pour ajouter les fichiers supprimés à la zone de transfert, puis les valider

git commit -m "Deleted files manually"
727
Cody Caughlan

Si vous courez simplement:

git add -u

git mettra à jour son index pour savoir que les fichiers que vous avez supprimés doivent faire partie du prochain commit. Ensuite, vous pouvez exécuter "git commit" pour vérifier cette modification.

Ou, si vous courez:

git commit -a

Il prendra automatiquement ces modifications (et toutes les 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
355
Emil Sit

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 commande addremove de hg (bien que la détection de déplacement soit automatique).

164
Dustin

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 de 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 aisée.

92
Saeb Amini
git rm test.txt

Avant ou après avoir supprimé le fichier actuel.

61
Peaker

En utilisant git-add avec les options '--all' ou '--update', vous obtiendrez peut-être plus que ce que vous souhaitiez. Les fichiers nouveaux et/ou modifiés seront également ajoutés à l'index. Je dispose d’un alias bash pour pouvoir 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 comme étant supprimés.

48
zobie

Non pas que cela compte vraiment, 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 de 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 récupérera que les fichiers supprimés qui ont été suivis.

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

38
Stephan Tual

Si ce sont les seuls changements, vous pouvez simplement faire

git commit -a

commettre tous les changements. Cela inclura les fichiers supprimés.

28
SpoonMeiser
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.
19
Sijo Kurian

git add -u

-u -- update Ne comparez que les fichiers déjà suivis dans l'index plutôt que l'arborescence de travail. Cela signifie qu'il ne mettra jamais en scène de nouveaux fichiers mais qu'il mettra en scène le nouveau contenu modifié des fichiers suivis et qu'il supprimera les fichiers de l'index si les fichiers correspondants de l'arborescence de travail ont été supprimés.

Si non, la valeur par défaut est "."; En d'autres termes, mettez à jour tous les fichiers suivis du répertoire actuel et de ses sous-répertoires.

15
Obay

Cette solution simple fonctionne bien pour moi:

git rm $(git ls-files --deleted)
14
Husam Bdr

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

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

Ensuite, tout ce que vous avez à faire est de lancer:

git rma
10
Evan Moran
git ls-files --deleted -z | xargs -0 git rm --cached

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

En fonction de votre variante POSIX, vous devrez peut-être utiliser xargs -0 -r: ceci entraînera la fermeture de xargs lorsque le contenu null sera redirigé.

EDIT: Les drapeaux --cached et --deleted sont utilisés en tandem pour éviter toute suppression accidentelle de fichiers qui n'ont pas encore été supprimés.

8
Murphy Danger

Veuillez utiliser -t pour voir quelle commande est en cours d'exécution

J'ai juste modifié la réponse de Virender pour qu'elle en fasse de même:

git ls-files --deleted -z | xargs -t -0 git rm
6
Venkateswara Rao

Essayez-le.

-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.

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

ou 

git add --all && git commit -m "Your commit"
6
ilgam

Comme mentionné

git add -u

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

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

git reset HEAD <path>

si vous aimez garder vos commits organisés et propres.
NOTE: Cela pourrait aussi désagréger les fichiers supprimés, donc soyez prudent avec ces caractères génériques.

5
DarkNeuron

Aucun des drapeaux à git-add ne mettra en scène 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 le résultat.

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. Obtenir le statut des fichiers.
  2. Pour les fichiers supprimés, isolez le nom du fichier.
  3. Supprimez toutes les lignes commençant par #s, ainsi qu'une ligne d'état contenant le mot "supprimé". Je ne me souviens plus exactement de ce que c'était et ce n'est plus là. Vous devrez peut-être modifier cela 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 lignes grep -v.
  4. Transmettez les fichiers à git rm.

Coller ceci dans un alias de Shell maintenant ...

5
Xiong Chiamiov

Ce qui suit fonctionnera 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

5
l3x
git commit -m 'commit msg' $(git ls-files --deleted)

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

4
Chad

J'avais besoin de la même chose .__ et j'ai utilisé le bouton "étape changée" de git gui . Il ajoute aussi tout.

Et après "stage changé" j'ai fait "commit" ...

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

3
Serdar

Vous pouvez utiliser git add -u <filenames> pour créer les fichiers supprimés uniquement.

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

Le -u est 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 de git add consiste à rechercher les fichiers du répertoire de travail. Si vous spécifiez des fichiers que vous avez supprimés, ils ne seront pas trouvés.

2
thomasrutter

quelque chose comme 

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

peut le faire.

1
Jeremy French

(Encore une autre variante)

Je voulais supprimer tous les fichiers déjà supprimés des fichiers 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
1
urban

Ajout d'un alias système pour stocker les fichiers supprimés en tant que commande rm-all

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

WINDOWS doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

Remarque

Windows doit avoir bash installé.

1
Haris Krajina

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

0
Sawyer
git rm $(git ls-files -d)

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

0
A. Albershteyn