So entfernen Sie mehrere gelöschte Dateien im Git-Repository


236

Ich habe einige Dateien gelöscht und der Git-Status wird wie folgt angezeigt.

Ich habe mich verpflichtet und gepusht.

GitHub zeigt weiterhin die gelöschten Dateien im Repository an. Wie kann ich Dateien im GitHub-Repository löschen?

# 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

Wenn ich benutze git rm, gibt es folgendes.

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


Antworten:


637
git add -u 

aktualisiert alle Ihre Änderungen


31
Wirkt ein Zauber. Wenn Sie so etwas wie "git status | sed -n '/ ^ # * gelöscht: / s /// p' | xargs git rm" als Lösungsvorschlag für eine so einfache, aber häufige Anforderung sehen, wissen Sie, dass eine bessere Lösung ist: oder bald wird es um die Ecke sein.
Arcseldon

Einfach ist besser, das ist wirklich praktisch als der "Bash" Weg
Castiel

1
Der Autor fragt, wie Dateien entfernt werden sollen. Warum ist das Hinzufügen von Dateien die richtige Antwort?
Kelin

3
@kelin: aus git docs ( git-scm.com/docs/git-add ): "-u --update Aktualisiert den Index genau dort, wo bereits ein Eintrag vorhanden ist, der mit <Pfadspezifikation> übereinstimmt. Dadurch werden Indexeinträge entfernt und geändert Entspricht dem Arbeitsbaum, fügt jedoch keine neuen Dateien hinzu. Wenn bei Verwendung der Option -u keine <Pfadspezifikation> angegeben wird, werden alle nachverfolgten Dateien im gesamten Arbeitsbaum aktualisiert (alte Versionen von Git werden verwendet, um die Aktualisierung auf das aktuelle Verzeichnis und zu beschränken seine Unterverzeichnisse). "
Hedmon

92

Sei sehr vorsichtig git rm .; Möglicherweise wird mehr entfernt, als Sie möchten. Natürlich können Sie sich erholen, aber es ist einfacher, dies nicht tun zu müssen.

Am einfachsten wäre:

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

Sie können keine Shell-Platzhalter verwenden, da die Dateien nicht vorhanden sind. Sie können jedoch Folgendes verwenden (zumindest in Bash):

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

Oder überlegen Sie:

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

Dies nimmt die Ausgabe von git status, druckt standardmäßig nichts ( sed -n), aber in Zeilen, die beginnen # deleted:, wird das #und das entfernt deleted:und es wird gedruckt, was übrig bleibt; xargssammelt die Argumente und stellt sie einem git rmBefehl zur Verfügung. Dies funktioniert für eine beliebige Anzahl von Dateien, unabhängig von der Ähnlichkeit (oder Unähnlichkeit) der Namen.


6
Sie können Platzhalter verwenden (obwohl Sie diese möglicherweise maskieren müssen), und git stimmt mit den Pfaden im Index überein, nicht nur mit denen im Arbeitsbaum. Es spielt also keine Rolle, dass sie nicht im Dateisystem vorhanden sind.
Ben James

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmist ein zuverlässigerer Ansatz als der Versuch zu analysieren, git statusder benutzerorientiert ist und nicht garantiert wird, dass er über zukünftige Versionen stabil ist.
CB Bailey

@ Charles: Das ist sicherlich besser, aber es erfordert ziemlich viel Wissen darüber, mit welchen Optionen verfügbar ist git diff(was ich nicht hatte, nachdem ich es vorher nicht gebraucht hatte). Vielen Dank!
Jonathan Leffler

8
Beachten Sie, dass es auch "git ls-files --deleted"
Petr Gladkikh

1
Also, git ls-files --deleted | xargs git rmhabe den Trick für mich gemacht.
Fiacobelli

50

Eine andere Version der Antwort von ByScripts ist

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

Dadurch werden NUR die gelöschten Dateien aus dem Git entfernt.

Es kann auch zum Hinzufügen von NUR geänderten Dateien verwendet werden.

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

Diese Befehle funktionieren auch mit Gitbash für Windows.


2
Unbezahlbar, das git ls-filesmit Status gelöscht oder geändert ist so hilfreich.
Mario Peshev

1
Das Verhalten 'git add --update (or -u)'ohne Pfadargument aus einem Unterverzeichnis des Baums ändert sich in Git 2.0 und sollte nicht mehr verwendet werden. Um Inhalt für den gesamten Baum git add --update :/ hinzuzufügen, führen Sie Folgendes aus : (oder git add -u: /) Um den Befehl auf das aktuelle Verzeichnis zu beschränken, führen git add --update . Sie Folgendes aus : (oder git add -u.) Bei der aktuellen Git-Version ist der Befehl auf das beschränkt aktuelles Verzeichnis
Ans

1
Irgendeine Idee, wie man mit Pfaden mit Leerzeichen umgeht? Beispiel : src/my spaced directory/myfile. Dies kann individuell behandelt werden, aber wie kann es mit den Befehlen in dieser Antwort behandelt werden?
Muhammad Gelbana

35

Aktualisieren Sie alle vorgenommenen Änderungen:

git add -u

Die gelöschten Dateien sollten von nicht bereitgestellt (normalerweise rote Farbe) zu bereitgestellt (grün) wechseln. Dann verpflichten Sie sich, die gelöschten Dateien zu entfernen:

git commit -m "note"

1
Verdient das populistische Abzeichen.
John

1
Dies ist bei weitem die beste Lösung. Keine Scripting-Hacks, kein langwieriger Prozess, nur ein Flag, das git anweist, seinen Index gründlich zu aktualisieren.
Ron Dahlgren

Brillant! Ersparte mir die Eingabe von mehr als 20 Dateipfaden. Vielen Dank!
Allardbrain

12

Die beste Lösung, wenn Sie sich nicht für das Staging geänderter Dateien interessieren, ist die Verwendung git add -uwie von mshameers und / oder pb2q angegeben .

Wenn Sie nur gelöschte Dateien entfernen möchten, aber keine geänderten Dateien bereitstellen möchten, sollten Sie das ls-filesArgument mit der --deletedOption verwenden (Sie müssen keinen regulären Ausdruck oder andere komplexe Argumente / Optionen verwenden):

git ls-files --deleted | xargs git rm

1
git add -Alöst dieses Problem ... nur für den Fall, dass jemand es in Zukunft wissen möchte. Überprüfen Sie die folgende Antwort
Ja8zyjits

8

Ja, git rm <filename>wird den gelöschten Status einer Datei <filename>bereitstellen , wobei es sich um ein Glob-Muster handeln könnte:

$ 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
#       ...

Dann können Sie festschreiben.

git commit -a wird dies auf einmal tun, wenn Sie wollen.

Sie können auch git add -ualle Änderungen, einschließlich aller gelöschten Dateien, bereitstellen und dann festschreiben.


so rm. (Punkt) sofort löschen?
Shin

Also wird nur git rm alles auf einmal entfernen?
Shin

1
Sie können ein Muster im Glob-Stil verwenden, um mehrere Dateien zu entfernen. Ich habe meine Antwort aktualisiert, um ein Beispiel zu zeigen.
Ben James

5
Es scheint git add -ugenau das zu sein, wonach wir suchen - wenn Sie viele Löschungen vornehmen, möchten Sie alle Löschungen festschreiben, was der einfachste und "Standard" -Methode zu sein scheint (dh ohne fallspezifische Globs oder komplexe Shell-Analyse) xargs). Gibt es einen Grund, warum wir dies nicht verwenden möchten, außer der Tatsache, dass alle Änderungen auf einmal hinzugefügt werden?
Trisweb

7

Wenn ich viele Dateien gelöscht habe, die nicht für das Festschreiben bereitgestellt wurden, können Sie git rmsie alle in einer Show anzeigen mit:

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

Wie bereits erwähnt, seien Sie vorsichtig mit git rm.



3

Sie können verwenden

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

Nachdem Sie Dateien manuell gelöscht hatten.


1
Oder identisch, aber prägnanter: git commit -am "Dateien entfernen"
BradChesney79

3

Sie können ein Shell-Skript erstellen, das beim Ausführen alle Ihre Dateien entfernt:

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

Das erstellte Skript ist remove.shund enthält die vollständige Liste der git rmBefehle.


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


2

Wenn Sie alle mit "git rm" löschen möchten. Das ist was ich mache:

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

Diese Abfrage listet alle Dateien auf, die entfernt wurden, und löscht sie aus Ihrem Git-Repository. Ich hoffe es hilft.



1

Ich hatte dieses Problem mit Geisterdateien in meinem Repo, nachdem ich sie gelöscht hatte und auf diesen ordentlichen Befehl gestoßen war!

git add -A

Es ist im Wesentlichen dasselbe wie git add -aund git add -ukombiniert, aber es unterscheidet zwischen Groß- und Kleinschreibung. Ich habe es von diesem fantastischen Link erhalten (dieser Link verweist jetzt auf die Version auf archive.org, da das Original ab Juni 2016 in eine Spam- / Phishing-Seite konvertiert wurde).


0

Hier erfahren Sie, wie Sie gelöschte Dateien erkennen und im Rahmen des nächsten Commits löschen. Alle Lösungen in diesem Thread haben unterschiedliche Vorzüge. Diese unten stehende Lösung befasst sich speziell mit dem Problem von Dateinamen mit Leerzeichen.

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

Stellen Sie sicher, dass Sie dies mit der Option --dry-run von git testen, bevor Sie Folgendes ausführen:

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

Erläuterung:

git status --porcelain

Dies druckt so etwas wie D "/ Pfad zu einem Ordner / Pfad zu einer Datei" aus, was nur passiert, wenn die Pfadnamen Leerzeichen enthalten

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

stimmen nur mit Zeilen überein, die mit "D" beginnen

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

Entfernen Sie "D" von der Vorderseite jeder Zeichenfolge

tr -d '"'

Entfernen Sie gegebenenfalls Anführungszeichen

xargs -I {} git rm '{}'

Definieren Sie Dateinamenvariablen als {} Ausführen des Dateinamens unter git rm in einfachen Anführungszeichen, um sicherzustellen, dass Dateinamen mit Leerzeichen unterstützt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.