Entfernen mehrerer Dateien aus einem Git-Repo, die bereits von der Festplatte gelöscht wurden

1311

Ich habe ein Git-Repo, bei dem ich vier Dateien aus rm( nicht git rm ) gelöscht habe , und mein Git-Status sieht folgendermaßen aus:

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

Wie entferne ich diese Dateien von Git, ohne sie manuell durchlaufen und jede Datei wie folgt hinzufügen zu müssen:

git rm file1 file2 file3 file4

Im Idealfall suche ich nach etwas, das genauso git add .funktioniert wie, wenn das möglich ist.

Codebeef
quelle
10
@seth, es ist nicht immer bequem zu verwenden git rm, das Entfernen könnte von einem separaten Tool, einer IDE oder einem Dateimanager erfolgen. Visual Studio kann beim Entfernen / Umbenennen von Dateien schmerzhaft sein.
Brett Ryan
67
Ugh, zu fragen, warum jemand nicht benutzt, git rmist ein bisschen wie zu fragen, warum er nicht benutzt git vimoder git cd. Es ist eine dumme Sache, etwas zu tun, und git sollte einen eingebauten Befehl oder Alias ​​haben, um gelöschte Dateien aus der Bereitstellung zu entfernen, und Sie sollten es nicht in SO nachschlagen oder Manpages in Ihrer Mittagspause lesen müssen.
WCWedin
7
Varinders Antwort ist kein guter Weg. Betrachten Sie git add -u, wie Cody vorgeschlagen hat und was auch die Antwort auf diese Frage ist: stackoverflow.com/questions/1402776/…
Roland

Antworten:

2300

Für Git 1.x.

$ git add -u

Dies weist git an, verfolgte Dateien automatisch bereitzustellen - einschließlich des Löschens der zuvor verfolgten Dateien.

Für Git 2.0

So inszenieren Sie Ihren gesamten Arbeitsbaum:

$ git add -u :/

Um nur den aktuellen Pfad zu inszenieren:

$ git add -u .
Carl
quelle
133
Beachten Sie, dass dadurch alle geänderten, nachverfolgten Dateien hinzugefügt werden - gelöscht und aktualisiert.
Ian Hunter
19
@beanland, Sie müssen nur den Pfad zu der bestimmten Datei angeben, die Sie ändern möchten, wenn Sie nicht möchten, dass alle Dateien abgerufen werden. zB git add -u [Pfad]
Paul Prewett
27
auch git add -u folder/um diesen Vorgang in einem Ordner auszuführen
c ..
2
Zu Ihrer
Information
1
Es könnte die Frage sein, die die Leute stellten, als sie auf dieser Seite ankamen, und es könnte sein, was das OP eigentlich wollte, aber es beantwortet nicht die genaue Frage, die gestellt wurde.
Relequestual
1362
git ls-files --deleted -z | xargs -0 git rm 

könnte sein, wonach Sie suchen .. es funktioniert für mich ..

Varinder
quelle
5
Versuchen Sie für Windows, den folgenden Alias ​​in Ihrer Konfiguration ohne die oben von Evan Moran angegebenen Anführungszeichen hinzuzufügen: 'remove =! git ls-files --deleted -z | xargs -0 git rm '
CLS
21
Seien Sie
44
@ DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max Nanasy
15
git add -u, wie Cody vorgeschlagen hat, ist ein viel einfacherer und sicherer Weg, ohne das Risiko, versehentlich Dateien zu löschen.
Roland
4
Dies herunterzustimmen, da es die falsche Antwort ist, auch wenn es für einige Dateien funktioniert. benutze "git add -u" unten. Dafür ist es da.
n13
733

Sie können verwenden

git add -u

Um die gelöschten Dateien zum Staging-Bereich hinzuzufügen, schreiben Sie sie fest

git commit -m "Deleted files manually"
Cody Caughlan
quelle
101
Bitte beachten Sie den Google-Nutzer: Er fügt die geänderten nachverfolgten Dateien auch dem Staging-Bereich hinzu.
Erenon
4
Führen Sie diesen Befehl nur aus, wenn Sie die Dateien gerade entfernt haben und sie sofort bereitstellen möchten.
Aryo
1
Ich bin nicht in der Lage, Datei aus Bitbucket Repo zu entfernen]
Srinivas Gowda
356

Wenn Sie einfach laufen:

git add -u

git aktualisiert seinen Index, um zu wissen, dass die von Ihnen gelöschten Dateien tatsächlich Teil des nächsten Commits sein sollten. Dann können Sie "git commit" ausführen, um diese Änderung einzuchecken.

Oder wenn Sie laufen:

git commit -a

Diese Änderungen (und alle anderen) werden automatisch übernommen und festgeschrieben.

Update : Wenn Sie nur gelöschte Dateien hinzufügen möchten, versuchen Sie Folgendes:

git ls-files --deleted -z | xargs -0 git rm
git commit
Emil Setz dich
quelle
1
Richtig, git commit -awird tun, was ich will, außer in einigen Fällen habe ich Dateien, die ich nicht festschreiben möchte, also möchte ich das Festschreiben manuell vorbereiten.
Igor Zevaka
2
Commit -a führt im Wesentlichen zuerst ein "add -u" aus. Der Index wird mit allen Änderungen an bekannten Dateien aktualisiert (seien es Löschungen oder einfache Änderungen). Sie können natürlich spezifischer sein und nur die gewünschten Dateien hinzufügen. git.or.cz/gitwiki/… kann hilfreich sein.
Emil Sit
2
Der Befehlssatz unter "Update: .." funktionierte wie ein Zauber. Vielen Dank!
Jay Taylor
10
Vielen Dank für 'git ls-files --deleted | xargs git rm '!
Mit
18
"git ls-files --deleted | xargs git rm" ist die richtige Antwort! Vielen Dank!
Reto
166

Sie suchen wahrscheinlich -A:

git add -A

Dies ähnelt git add -u, fügt aber auch neue Dateien hinzu. Dies entspricht in etwa dem addremoveBefehl von hg (obwohl die Bewegungserkennung automatisch erfolgt).

Dustin
quelle
8
Kurz gesagt, die Verwendung von -u begrenzt das Hinzufügen zu verfolgten Dateien und -a schließt auch nicht verfolgte Dateien ein. Ich dachte nur, ich würde auf den Unterschied hinweisen.
spaaarky21
Zu diesem Zeitpunkt können Sie alle Daten auch über das Commit -a-Flag hinzufügen.
Zac Grierson
94

So stellen Sie nur die gelöschten Dateien bereit :

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

Oder (der xargs Weg):

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

Du kannst Ihren bevorzugten Befehlssatz für eine bequeme spätere Verwendung als Alias verwenden.

Saeb Amini
quelle
2
@Saeb Verstehe die Warteschlange, aber xargses dauert ungefähr 15 Minuten, um sie zu meistern.
Eric Wilson
11
git status | awk '/deleted/ {print $3}' | xargs git rmwäre ein kürzerer Weg, das zu tun. grep | awk... Sag einfach Nein
Mark Reed
58
git rm $(git ls-files --deleted)ist das nicht bequeme (kopiert diese ).
Hotschke
1
xargs oder die obige $ () - Ersetzung, wenn Sie wissen, dass die Liste nicht riesig ist. Wenn die Liste ist riesig: git ls-files --deleted | while read f; do git rm $f; done
Andrew
2
@Andrew xargsist wahrscheinlich effizienter als eine while-Schleife für eine große Liste, da bei jeder Ausführung mehr als ein Argument übergeben wird git rm. git rmVerwenden Sie die folgende -nOption, um die Anzahl der Argumente zu begrenzen, die bei jeder Ausführung übergeben werden :git ls-files --deleted | xargs -n 15 git rm
Ajedi32
61
git rm test.txt

Vor oder nach dem Löschen der eigentlichen Datei.

Peaker
quelle
7
Während es funktioniert, lösche ich oft eine Menge Dateien durch rmund bereue es später.
Carl
4
Warum ist das schlimmer als zu tun git add -u? Es scheint sicherer zu sein, die spezifischen Dateien, die gelöscht wurden, zum Commit hinzuzufügen, als ALLE Änderungen hinzuzufügen .
Ian Dunn
2
Eigentlich sollte dies die beste Antwort gemäß der letzten Zeile der Frage sein. "Ich möchte nur einen Befehl, der alle Dateien aus Git löscht, die auch von der Festplatte gelöscht werden."
Ramsharan
2
@ Ramsharan nein, weil es das überhaupt nicht tut. Dadurch wird eine einzelne Datei gelöscht. Das OP forderte SPEZIELL "alle" gelöschten Dateien an.
Adam
1
@ Ramsharan Nein, das ist der Punkt - in fast allen Fällen können Sie NICHT einfach einen Platzhalter verwenden (es gibt keinen Platzhalter, der übereinstimmt). Deshalb gibt es die Hauptantwort, die so viel komplizierter ist.
Adam
49

Wenn Sie git-add mit den Optionen '--all' oder '--update' verwenden, erhalten Sie möglicherweise mehr als Sie wollten. Neue und / oder geänderte Dateien werden ebenfalls zum Index hinzugefügt. Ich habe ein Bash-Alias-Setup für den Fall, dass ich gelöschte Dateien aus Git entfernen möchte, ohne andere Dateien zu berühren:

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

Alle Dateien, die aus dem Dateisystem entfernt wurden, werden dem Index als gelöscht hinzugefügt.

Zobie
quelle
39

Nicht, dass es wirklich wichtig wäre, aber ich bin mit der gewählten Antwort nicht einverstanden:

git add -u 

... entfernt Dateien aus dem Index, wenn die entsprechenden Dateien im Arbeitsbaum entfernt wurden, stellt aber auch den geänderten neuen Inhalt der nachverfolgten Dateien bereit.

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

... rm hingegen nur die gelöschten Dateien, die verfolgt wurden.

Letzteres ist meiner Ansicht nach die bessere Option.

Stephan Tual
quelle
29

Wenn dies die einzigen Änderungen sind, können Sie dies einfach tun

git commit -a

alle Änderungen festschreiben. Dazu gehören gelöschte Dateien.

SpoonMeiser
quelle
3
Ich bin mir nicht sicher, warum ich abgelehnt wurde. git kann Dateien, die gelöscht wurden, gut identifizieren, auch wenn Sie dies nicht explizit mithilfe von git rm mitgeteilt haben.
SpoonMeiser
Sie wurden herabgestimmt, weil "-a" kein akzeptabler Schalter ist, sondern "-A". Bearbeiten Sie Ihre Antwort.
Sheharyar
10
Nein, "-a" ist ein akzeptabler Schalter, da der Befehl festgeschrieben ist . "-A" ist ein Schalter zum Hinzufügen, aber nicht zum Festschreiben . Ich sehe, dass Ihre vorgeschlagene Bearbeitung bereits abgelehnt wurde.
SpoonMeiser
Falls das einzige, was Sie festschreiben, die gelöschte Datei ist, fügen Sie den Schalter --allow-empty
billrichards
äh, eigentlich --allow-leer wird nur benötigt, wenn Sie gm rm --cached
billrichards
20
git ls-files --deleted | xargs git rm 

ist die beste Option, um nur gelöschte Dateien hinzuzufügen.

Hier sind einige andere Optionen.

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
quelle
16

git add -u

-u --update Stimmt nur mit bereits verfolgten Dateien im Index überein und nicht mit dem Arbeitsbaum. Dies bedeutet, dass niemals neue Dateien bereitgestellt werden, sondern dass geänderte neue Inhalte von verfolgten Dateien bereitgestellt werden und dass Dateien aus dem Index entfernt werden, wenn die entsprechenden Dateien im Arbeitsbaum entfernt wurden.

Wenn nein angegeben wird, ist standardmäßig "."; Mit anderen Worten, aktualisieren Sie alle verfolgten Dateien im aktuellen Verzeichnis und seinen Unterverzeichnissen.

Obay
quelle
Die am besten gewählte Antwort sagt bereits zu verwenden git add -u. Woher kommen all die anderen Dinge in Ihrer Antwort, die Dokumentation? Sie sollten auf die Dokumentation verlinken und sie blockieren, wenn dies der Fall ist.
TheWarriorNamedFoo
14

Diese einfache Lösung funktioniert gut für mich:

git rm $(git ls-files --deleted)
Houssem Badri
quelle
Ich denke, Sie sollten immer Git Shell in
Ihrem
2
Dies ist nett und einfach, funktioniert aber nicht mit rekursiven Ordnern.
DrB
@BehnazChangizi Ich denke, es tut, stackoverflow.com/questions/1054044/…
Houssem Badri
@PvdL nicht akzeptierte Leerzeichen im Pfad ist os-specefic Problem
Houssem Badri
11

Wenn Sie es zu Ihrem hinzufügen möchten, gehen Sie wie folgt vor .gitconfig:

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

Dann müssen Sie nur noch Folgendes ausführen:

git rma
Evan Moran
quelle
1
und von cmd linegit 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

Dadurch werden alle gelöschten Dateien entfernt, die zuvor von git verfolgt wurden, und der Fall behandelt, in dem Ihre Dateinamen Leerzeichen enthalten.

Abhängig von Ihrer POSIX-Variante müssen Sie möglicherweise Folgendes verwenden xargs -0 -r: Dies führt dazuxargs zu einem ordnungsgemäßen Beenden, wenn Nullinhalte weitergeleitet werden.

BEARBEITEN: --cachedund --deletedFlags werden zusammen verwendet, um zu verhindern, dass versehentlich Dateien gelöscht werden, die noch nicht gelöscht wurden.

Murphy Gefahr
quelle
7

Weisen Sie den Befehl an, Dateien, die geändert und gelöscht wurden, automatisch bereitzustellen, aber neue Dateien, von denen Sie Git nichts erzählt haben, sind nicht betroffen:

-a
--all

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

oder

git add --all && git commit -m "Your commit"
ilgam
quelle
1
git add --all && git commit -m "Ihr Commit" Dies funktionierte bei mir in Windows-7 mit der Git-Bash-Befehlsshell.
Kmarabet
1
Der folgende Befehl funktionierte in Windows-7 mit der Git-Bash-Befehlsshell: $ git add --all && git commit -m "Eigenschaftendateien entfernen" [master 58c41ac] Eigenschaftendateien entfernen 1 Datei geändert, 9 Löschungen (-). .. Um diese festgeschriebenen Änderungen in das Remote-Repository zu übertragen, wurde Folgendes ausgeführt: $ git push origin .. Objekte zählen: 10, erledigt.
Kmarabet
6

Folgendes funktioniert auch dann, wenn Sie viele Dateien verarbeiten müssen:

git ls-files --deleted | xargs git rm

Sie werden wahrscheinlich auch einen Kommentar abgeben wollen.

Weitere Informationen finden Sie unter: Nützliche Git-Skripte

l3x
quelle
6

Bitte verwenden Sie, um -tzu sehen, welcher Befehl tatsächlich ausgeführt wird

Ich habe gerade die Antwort von Virender optimiert, um dasselbe zu tun:

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

Keines der zu git-add zu verwendenden Flags stellt nur entfernte Dateien bereit. Wenn Sie nur gelöschte Dateien geändert haben, ist das in Ordnung. Andernfalls müssen Sie den Git-Status ausführen und die Ausgabe analysieren.

Nach Jeremys Antwort habe ich Folgendes erhalten:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Status der Dateien abrufen.
  2. Isolieren Sie bei gelöschten Dateien den Namen der Datei.
  3. Entfernen Sie alle Zeilen, die mit #s beginnen, sowie eine Statuszeile mit dem Wort "gelöscht". Ich erinnere mich nicht genau, was es war, und es ist nicht mehr da, daher müssen Sie dies möglicherweise für verschiedene Situationen ändern. Ich denke, die Gruppierung von Ausdrücken könnte eine GNU-spezifische Funktion sein. Wenn Sie also keine Gnutils verwenden, müssen Sie möglicherweise mehrere grep -vZeilen hinzufügen .
  4. Übergeben Sie die Dateien an git rm.

Jetzt in einen Shell-Alias ​​stecken ...

Xiong Chiamiov
quelle
5

Wie erwähnt

git add -u

Stuft die entfernten Dateien zum Löschen ein, ABER AUCH geänderte Dateien zum Aktualisieren.

Um die geänderten Dateien zu entfernen, können Sie dies tun

git reset HEAD <path>

wenn Sie Ihre Commits organisiert und sauber halten möchten.
HINWEIS: Dadurch können auch die gelöschten Dateien entfernt werden. Gehen Sie daher vorsichtig mit diesen Platzhaltern um.

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

Dies funktionierte bei mir, nachdem ich die Dateien bereits gelöscht hatte.

Tschad
quelle
3

Ich brauchte das gleiche und benutzte Git Gui "Stage Changeed" Button. es fügt auch alles hinzu.

Und nachdem "Stage Change" "Commit" gemacht habe ...

Mein Arbeitsverzeichnis ist also wieder sauber.

Serdar
quelle
Nun, eine GUI zu benutzen ist CHEATING, lol! Aber schneller in den Fällen, in denen der GUI-Designer Ihre Anforderungen erfüllt hat. Es ist gut zu wissen, wie man mit "was unter der Haube ist" bastelt.
Dennis
1
Zu Ihrer
Information
3
git rm $(git ls-files -d)

Entfernt alle vom git ls-filesBefehl aufgelisteten Dateien (-d zeigt nur gelöschte Dateien an). Funktioniert nicht für Dateien mit Leerzeichen im Dateinamen oder Pfad, ist aber einfach zu merken

A. Albershteyn
quelle
2

Sie können git add -u <filenames>nur die gelöschten Dateien bereitstellen.

Wenn Sie beispielsweise die Dateien gelöscht haben templates/*.tpl, verwenden Sie git add -u templates/*.tpl.

Das -uist erforderlich, um auf Dateien zu verweisen, die im Repository vorhanden sind, aber nicht mehr im Arbeitsverzeichnis vorhanden sind. Andernfalls wird standardmäßig git addnach den Dateien im Arbeitsverzeichnis gesucht. Wenn Sie dort angegebene Dateien angeben, werden diese nicht gefunden.

thomasrutter
quelle
2

Hinzufügen eines Systemalias zum Bereitstellen gelöschter Dateien als Befehl rm-all

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

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

Hinweis

Windows muss bashinstalliert sein.

Haris Krajina
quelle
2

(Noch eine Variation)

Ich wollte alle bereits gelöschten Dateien aus den Datenträgerdateien löschen, jedoch aus einem bestimmten Ordner, wobei die anderen Ordner unberührt blieben. Folgendes hat bei mir funktioniert:

git ls-files --deleted  | grep <folder-name> | xargs git rm
städtisch
quelle
1

etwas wie

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

kann es tun.

Jeremy French
quelle
2019 Git Version 2.13.3:git diff --diff-filter=D --name-only | xargs git rm
User151841
1

Für visuelles Studio-Projekt

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

Dies ist nützlich, wenn der gelöschte Dateipfad Speicherplatz hat

Sawyer
quelle
-1

Die flexibelste Lösung, die ich bisher gefunden habe, ist zu

git cola

Und wählen Sie alle gelöschten Dateien aus, die ich bereitstellen möchte.

(Beachten Sie, dass ich normalerweise alles über die Befehlszeile in git mache, aber git behandelt entfernte Dateien etwas umständlich).

Broes De Cat
quelle
Wildcards funktionierten nicht für mich, git add -u path/to/my/deleted-files-pattern-*.ymldaher war dies die beste Antwort für mich (ich wollte nicht alle gelöschten Dateien inszenieren, sondern 50 von ein paar hundert).
mlncn