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.
$ git add -u
Dies weist git an, automatisch nachverfolgte Dateien in Szene zu setzen, einschließlich des Löschens der zuvor nachverfolgten Dateien.
Um Ihren gesamten Arbeitsbaum zu inszenieren:
$ git add -u :/
Um nur den aktuellen Pfad in Szene zu setzen:
$ git add -u .
git ls-files --deleted -z | xargs -0 git rm
vielleicht ist es das, wonach du suchst .. es funktioniert für mich ..
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"
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
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).
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.
git rm test.txt
Vor oder nach dem Löschen der eigentlichen Datei.
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.
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.
Wenn dies die einzigen Änderungen sind, können Sie dies einfach tun
git commit -a
alle Änderungen festlegen. Dazu gehören gelöschte Dateien.
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.
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.
Diese einfache Lösung funktioniert gut für mich:
git rm $(git ls-files --deleted)
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
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.
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
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"
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.
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
grep -v
-Zeilen hinzufügen.git rm
.Dies wird jetzt in einen Shell-Alias eingefügt ...
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
git commit -m 'commit msg' $(git ls-files --deleted)
Dies funktionierte für mich, nachdem ich die Dateien bereits gelöscht hatte.
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.
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.
so etwas wie
git status | sed -s "s/^.*deleted: //" | xargs git rm
kann es tun.
(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
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.
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
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