wake-up-neo.com

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

Ich habe ein Git-Repo, bei dem ich vier Dateien mit 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 manuell jede Datei wie folgt hinzufügen zu müssen:

git rm file1 file2 file3 file4

Idealerweise suche ich nach etwas, das auf dieselbe Weise funktioniert wie git add ., falls dies möglich ist.

1259
Codebeef

Für Git 1.x

$ git add -u

Dies weist git an, automatisch nachverfolgte Dateien in Szene zu setzen, einschließlich des Löschens der zuvor nachverfolgten Dateien. 

Für Git 2.0

Um Ihren gesamten Arbeitsbaum zu inszenieren:

$ git add -u :/

Um nur den aktuellen Pfad in Szene zu setzen:

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

vielleicht ist es das, wonach du suchst .. es funktioniert für mich .. 

1342
Varinder

Sie können verwenden 

git add -u

Um die gelöschten Dateien zum Bereitstellungsbereich hinzuzufügen, machen Sie sie anschließend fest

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

Wenn Sie einfach laufen lassen:

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 du rennst:

git commit -a

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

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
355
Emil Sit

Sie suchen wahrscheinlich nach -A:

git add -A

dies ist ähnlich wie bei git add -u, fügt aber auch neue Dateien hinzu. Dies entspricht in etwa dem Befehl addremove von hg (obwohl die Bewegungserkennung automatisch erfolgt).

164
Dustin

Nur die gelöschten -Dateien inszenieren

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

Sie können Alias ​​ Ihren bevorzugten Befehlssatz für die spätere Verwendung verwenden.

92
Saeb Amini
git rm test.txt

Vor oder nach dem Löschen der eigentlichen Datei.

61
Peaker

Wenn Sie git-add mit den Optionen "--all" oder "--update" verwenden, erhalten Sie möglicherweise mehr als Sie möchten. Neue und/oder geänderte Dateien werden ebenfalls zum Index hinzugefügt. Ich habe ein Bash-Alias-Setup, wenn ich gelöschte Dateien von 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.

48
zobie

Nicht, dass es wirklich wichtig ist, aber ich stimme der gewählten Antwort nicht zu:

git add -u 

... entfernt Dateien aus dem Index, wenn die entsprechenden Dateien im Arbeitsbaum entfernt wurden, aber es werden auch die geänderten neuen Inhalte der verfolgten Dateien bereitgestellt. 

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

... dagegen werden nur die gelöschten Dateien gelöscht, die verfolgt wurden.

Letzteres ist meiner Meinung nach die bessere Option. 

38
Stephan Tual

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

git commit -a

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

28
SpoonMeiser
git ls-files --deleted | xargs git rm 

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

Hier sind einige andere Möglichkeiten.

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 Stimmt nur mit bereits verfolgten Dateien im Index und nicht mit der Arbeitsstruktur überein. Das bedeutet, dass nie neue Dateien bereitgestellt werden, sondern dass veränderte neue Inhalte verfolgter Dateien in Szene gesetzt werden und dass Dateien aus dem Index entfernt werden, wenn die entsprechenden Dateien im Arbeitsbaum entfernt wurden.

Wenn nein angegeben wird, ist standardmäßig "."; Aktualisieren Sie also alle verfolgten Dateien im aktuellen Verzeichnis und dessen Unterverzeichnissen.

15
Obay

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

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

Wenn Sie es zu Ihrem .gitconfig hinzufügen möchten, tun Sie dies:

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

Dann musst du nur noch laufen:

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

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

Abhängig von Ihrer POSIX-Variante müssen Sie möglicherweise xargs -0 -r verwenden: Dies führt dazu, dass xargs ordnungsgemäß beendet wird, wenn der Inhalt von Pipe-NULLs übergeben wird.

EDIT: Die Codes --cached und --deleted werden zusammen verwendet, um das versehentliche Löschen von Dateien zu verhindern, die noch nicht gelöscht wurden.

8
Murphy Danger

Verwenden Sie -t, um zu sehen, welcher Befehl gerade ausgeführt wird

Ich habe gerade die Virender-Antwort angepasst, um dasselbe zu tun:

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

Versuch es.

-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"

oder 

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

Wie erwähnt

git add -u

stellt die entfernten Dateien zum Löschen bereit, ABER modifiziert auch die Dateien für das Update.

Um die modifizierten Dateien zu entpacken, können Sie dies tun

git reset HEAD <path>

wenn Sie Ihre Verpflichtungen organisiert und sauber halten möchten.
HINWEIS: Dies könnte auch die gelöschten Dateien aufheben, also vorsichtig mit diesen Platzhaltern.

5
DarkNeuron

Keines der Flags für git-add wird nur entfernte Dateien bereitstellen. Wenn alle Dateien, die Sie geändert haben, gelöschte Dateien sind, sind Sie in Ordnung, aber ansonsten müssen Sie git-status ausführen und die Ausgabe analysieren.

Als Antwort auf Jeremys Antwort habe ich Folgendes bekommen:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. Status der Dateien abrufen.
  2. Isolieren Sie für gelöschte Dateien den Namen der Datei.
  3. Entfernen Sie alle Zeilen, die mit # beginnen, sowie eine Statuszeile, in der das Wort "gelöscht" wurde. 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, dass die Gruppierung von Ausdrücken eine GNU-spezifische Funktion sein kann. Wenn Sie also nicht gnutils verwenden, müssen Sie möglicherweise mehrere grep -v-Zeilen hinzufügen.
  4. Übergeben Sie die Dateien an git rm.

Dies wird jetzt in einen Shell-Alias ​​eingefügt ...

5
Xiong Chiamiov

Das Folgende funktioniert auch dann, wenn Sie viele Dateien bearbeiten müssen:

git ls-files --deleted | xargs git rm

Sie möchten wahrscheinlich auch einen Kommentar machen.

Für Details siehe: Nützliche Git-Skripte

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

Dies funktionierte für mich, nachdem ich die Dateien bereits gelöscht hatte. 

4
Chad

Ich brauchte die gleiche Und benutzte git gui "stage changes" button .

Und nach "Phase verändert" habe ich "Commit" gemacht ...

also ist mein arbeitsverzeichnis wieder sauber.

3
Serdar

Sie können git add -u <filenames> verwenden, um nur die gelöschten Dateien zu inszenieren.

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

Der -u ist erforderlich, um auf Dateien zu verweisen, die im Repository vorhanden sind, im Arbeitsverzeichnis jedoch nicht mehr vorhanden sind. Andernfalls sucht git add standardmäßig nach den Dateien im Arbeitsverzeichnis. Wenn Sie Dateien angeben, die Sie dort gelöscht haben, werden sie nicht gefunden.

2
thomasrutter

so etwas wie 

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

kann es tun.

1
Jeremy French

(Noch eine Variation)

Ich wollte alle bereits gelöschten Dateien von den Festplattendateien löschen, jedoch aus einem bestimmten Ordner, wobei die anderen Ordner unverändert blieben. Folgendes hat für mich gearbeitet:

git ls-files --deleted  | grep <folder-name> | xargs git rm
1
urban

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

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

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

Anmerkung

Windows muss bash installiert haben.

1
Haris Krajina

Für ein visuelles Studio-Projekt

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

dies ist nützlich, wenn der Pfad der gelöschten Datei Platz hat

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

Entfernt alle Dateien, die mit dem Befehl git ls-files aufgelistet sind (-d zeigt nur gelöschte Dateien). Funktioniert nicht für Dateien mit Leerzeichen im Dateinamen oder Pfad, aber einfach zu merken

0
A. Albershteyn