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




git status deleted (19)

Für Git 1.x

$ git add -u

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

Für Git 2.0

Um deinen gesamten Arbeitsbaum zu inszenieren:

$ git add -u :/

Um nur den aktuellen Pfad zu inszenieren:

$ git add -u .

Ich habe ein Git Repo, dass ich vier Dateien von rm ( nicht git rm ) gelöscht habe, und mein Git-Status sieht so 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 durchlaufen zu müssen:

git rm file1 file2 file3 file4

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


(Noch eine Variante)

Ich wollte alle bereits gelöschten Dateien von den Dateien löschen, aber von einem bestimmten Ordner, wobei die anderen Ordner unberührt bleiben. Folgendes funktionierte für mich:

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

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

git cola

Und wähle alle gelöschten Dateien aus, die ich inszenieren möchte.

(Beachten Sie, dass ich in der Regel alle Befehlszeilen in Git, aber Git behandelt entfernte Dateien ein bisschen peinlich).


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

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

Für ein visuelles Studio-Projekt

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

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


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

git ls-files --deleted | xargs git rm

Sie werden wahrscheinlich auch einen Kommentar abgeben wollen.

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


Hinzufügen eines Systemalias zum Bereitstellen von gelöschten 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)"

Hinweis

Windows muss bash installiert haben.


Ich brauchte das gleiche und benutzte git gui "stage changed" Button. es fügt auch alles hinzu.

Und nach "stage changed" habe ich "commit" gemacht ...

Also ist mein Arbeitsverzeichnis wieder sauber.


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

git add -u 

... wird Dateien aus dem Index entfernen, wenn die entsprechenden Dateien in der Arbeitsbaumstruktur entfernt wurden, aber es werden auch die geänderten neuen Inhalte der verfolgten Dateien in die Anzeige übernommen.

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

Auf der anderen Seite werden nur die gelöschten Dateien gefunden, die verfolgt wurden.

Letzteres ist meiner Meinung nach die bessere Option.


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

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

Das -u wird benötigt, um auf Dateien zu verweisen, die im Repository vorhanden sind, aber nicht mehr im Arbeitsverzeichnis vorhanden sind. Andernfalls ist der Standardwert von git add , nach den Dateien im Arbeitsverzeichnis zu suchen, und wenn Sie Dateien angeben, die Sie dort gelöscht haben, werden sie nicht gefunden.


Um nur die gelöschten Dateien zu staffeln :

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

Oder (der Xargs Weg):

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

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


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"

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, 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.


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

git commit -a

um alle Änderungen zu übernehmen. Das schließt gelöschte Dateien ein.


Wie erwähnt

git add -u

Stellt die gelöschten Dateien zum Löschen bereit, ABER AUCH modifizierte Dateien für die Aktualisierung.

Um die geänderten Dateien zu deaktivieren, können Sie das tun

git reset HEAD <path>

Wenn Sie Ihre Commits organisiert und sauber halten möchten.
Hinweis: Dies könnte auch die gelöschten Dateien deaktivieren, so vorsichtig mit diesen Platzhaltern.


etwas wie

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

kann es tun.


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

könnte sein, was du suchst .. es funktioniert für mich ..


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

Dadurch werden alle gelöschten Dateien gelöscht, die zuvor von git nachverfolgt wurden. Außerdem werden die Fälle behandelt, in denen Ihre Dateinamen Leerzeichen enthalten.

Abhängig von Ihrer POSIX-Variante müssen Sie möglicherweise xargs -0 -r : Dies führt dazu, dass xargs , wenn Null-Inhalt piped wird.

EDIT: --cached und --deleted Flags werden in Tandem verwendet, um vor versehentlichem Löschen von Dateien zu schützen, die noch nicht gelöscht wurden.


git rm test.txt

Vor oder nach dem Löschen der eigentlichen Datei.





git-rm