web-dev-qa-db-fra.com

Comment supprimer plusieurs fichiers supprimés dans le référentiel Git

J'ai supprimé des fichiers et le statut de git est présenté ci-dessous.

J'ai commis et poussé.

GitHub affiche toujours les fichiers supprimés dans le référentiel. Comment puis-je supprimer des fichiers dans le référentiel GitHub?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

Si j'utilise git rm, cela donne ce qui suit.

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched
231
shin
git add -u 

met à jour toutes vos modifications

625
mshameers

Soyez très prudent avec git rm .; cela pourrait supprimer plus que vous ne le souhaitez. Bien sûr, vous pouvez récupérer, mais il est plus simple de ne pas avoir à le faire.

Le plus simple serait:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

Vous ne pouvez pas utiliser de caractères génériques Shell car les fichiers n'existent pas, mais vous pouvez utiliser (du moins dans Bash):

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

Ou considérez:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

Ceci prend la sortie de git status, n'imprime rien par défaut (sed -n), mais sur les lignes qui commencent # deleted:, il supprime le # et le deleted: et imprime ce qui reste; xargs rassemble les arguments et les fournit à une commande git rm. Cela fonctionne pour un nombre quelconque de fichiers, quelle que soit la similarité (ou la différence) des noms.

91
Jonathan Leffler

Une autre version de ByScripts répond

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

Cela supprimera UNIQUEMENT les fichiers supprimés du git.

Il pourrait également être utilisé pour ajouter UNIQUEMENT des fichiers modifiés.

git add $(git ls-files --modified)

Ces commandes fonctionnent également sur gitbash pour Windows.

50
Vijay C

Mettez à jour toutes les modifications que vous avez apportées:

git add -u

Les fichiers supprimés doivent passer d'un fichier non mis en scène (généralement de couleur rouge) à un fichier mis en scène (vert). Puis engagez-vous à supprimer les fichiers supprimés:

git commit -m "note"
35
Aziz Alto

La meilleure solution si vous ne vous souciez pas de la sauvegarde des fichiers modifiés consiste à utiliser git add -u comme indiqué par mshameers et/ou pb2q.

Si vous voulez seulement supprimer les fichiers supprimés, mais pas les fichiers modifiés, je pense que vous devriez utiliser l'argument ls-files avec l'option --deleted (inutile d'utiliser regex ou d'autres arguments/options complexes):

git ls-files --deleted | xargs git rm
12
ByScripts

Oui, git rm <filename> organisera l'état de suppression d'un fichier, où <filename> pourrait être un motif global:

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

Ensuite, vous pouvez vous engager.

git commit -a le fera en une fois, si vous voulez.

Vous pouvez également utiliser git add -u pour appliquer toutes les modifications, y compris tous les fichiers supprimés, puis valider.

8
Ben James

Quand j'ai beaucoup de fichiers que j'ai supprimés et qui n'ont pas été mis en attente pour la validation, vous pouvez git rm les tous en une seule émission avec:

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

Comme le répondeur l'a mentionné, soyez prudent avec git rm.

7
Justin Mandzik

Essaye ça:

 git rm `git ls-files -d`
5
eludom

Vous pouvez créer un script shell qui supprimera tous vos fichiers lors de l'exécution:

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

Le script créé est remove.sh et contient la liste complète des commandes git rm.

3
La-comadreja

Vous pouvez utiliser

git commit -m "remove files" -a
git Push

Après avoir supprimé les fichiers manuellement.

3
onalbi

Si vous voulez tous les supprimer en utilisant "git rm". C'est ce que je fais:

git ls-files --deleted -z | xargs -0 git rm

Cette requête répertorie tous les fichiers supprimés et les supprime de votre référentiel git. J'espère que ça aide.

2
DevWL
git status | sed 's/^#\s*deleted:\s*//' | sed 's/^#.*//' | xargs git rm -rf
2
Boush
git add -u .

git add --update .
2
euccas

La fonction de nettoyage intégrée peut également être utile ...

git clean -fd
1
Randall Borck

J'ai eu cette question de fichiers fantômes apparaissant dans mon dépôt après que je les ai supprimés et suis tombé sur cette commande soignée!

git add -A

C'est essentiellement la même chose que git add -a et git add -u combinés, mais c'est sensible à la casse. Je l'ai eu de ce lien génial (ce lien pointe maintenant vers la version sur archive.org, car l'original a été converti en page spam/hameçonnage en juin 2016)

1
NetOperator Wibby

Voici comment détecter les fichiers supprimés et organiser leur suppression dans le cadre du prochain commit. Toutes les solutions sur ce fil ont des mérites différents. Cette solution ci-dessous traite spécifiquement du problème des noms de fichiers contenant des espaces.

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

assurez-vous de le tester avec l'option --dry-run de git avant de l'exécuter avec les éléments suivants:

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

explication:

git status --porcelain

Ceci affiche quelque chose comme D "/ chemin vers un dossier/chemin vers un fichier" qui ne se produit que lorsqu'il y a des espaces dans les noms de chemin

awk '/^.D .*$/ {print $0}'

ne correspond qu'aux lignes commençant par "D"

sed 's/ D \(.*\)/\1/'

enlever "D" de l'avant de chaque chaîne

tr -d '"'

supprimer les guillemets, le cas échéant

xargs -I {} git rm '{}'

définissez les variables de nom de fichier comme {} exécutez nom de fichier sous git rm entre guillemets simples afin de vous assurer qu'il prend en charge les noms de fichier avec des espaces.

0
N D