Wie kann ich alle gelöschten Dateien in einem Git-Repository auflisten?

305

Ich weiß, dass Git Informationen darüber speichert, wann Dateien gelöscht werden, und ich kann einzelne Commits überprüfen, um festzustellen, welche Dateien entfernt wurden. Gibt es jedoch einen Befehl, der eine Liste aller gelöschten Dateien über die gesamte Lebensdauer eines Repositorys generiert?

Toby
quelle
Wenn Sie über diese Antwort stolpern, aber nur eine Liste der Dateien anzeigen möchten, die von einem Commit-Hash oder Zweig zu einem anderen hinzugefügt, umbenannt, gelöscht, geändert usw. wurden, gehen Sie wie folgt vor : git diff --name-status commit_hash.
Gabriel Staples

Antworten:

410
git log --diff-filter=D --summary

Siehe Suchen und Wiederherstellen einer gelöschten Datei in einem Git-Repository

Wenn Sie nicht alle Informationen darüber wünschen, in welchem ​​Commit sie entfernt wurden, können Sie dort einfach ein hinzufügen grep delete.

git log --diff-filter=D --summary | grep delete
Viel
quelle
13
Warnung: Hier werden alle Dateien aufgelistet, die Sie gelöscht haben. Wenn Sie eine Datei gelöscht und dann eine neue Datei mit demselben Namen erstellt haben, wird diese in dieser Liste angezeigt, obwohl dort eine Datei vorhanden ist.
TJ Crowder
24
Sie sollten sich auch den Git ansehen, der sich geändert hat Befehl . Es ist ziemlich cool.
Mr.Black
6
Dies würde auch die Umbenennungen als gelöscht auflisten. Um diese zu überspringen, verwenden Siegit log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic
2
Mit Git 2.9 ist die Erkennung von Umbenennungen standardmäßig aktiviert. Um diese wieder als gelöscht zu sehen, verwenden Siegit log --no-renames --diff-filter=D --summary | grep delete
Michael Große
2
Vorsicht bei der Verwendung, grep deletedenn wenn die Festschreibungsnachricht das Wort "Löschen" enthält, wird sie ebenfalls erfasst. Verwenden Sie grep 'delete mode'stattdessen.
Vadim
85

Das macht was du willst, denke ich:

git log --all --pretty=format: --name-only --diff-filter=D | sort -u

... was ich gerade mehr oder weniger direkt aus dieser anderen Antwort genommen habe .

Mark Longair
quelle
37

Wenn Sie nur die aktuell gelöschten Dateien anzeigen möchten, können Sie Folgendes verwenden:

git ls-files --deleted

Wenn Sie sie dann entfernen möchten (falls Sie sie gelöscht haben, ohne "git rm" zu verwenden), führt dies zu xargs git rm

git ls-files --deleted | xargs git rm
Jim Clouse
quelle
11
Dies zeigt nur Dateien im Index an, die in der Arbeitskopie gelöscht wurden. Das OP möchte alle Dateien, die jemals gelöscht wurden.
Max Nanasy
1
odergit rm $(git ls-files --deleted)
yunzen
Auch wenn es nicht das ist, was das OP wollte, war dies zumindest für mich selbst nützlich, da ich Probleme hatte, meine Anfrage in einer Suche richtig zu formulieren
Sonnenwende333
10

Unter Berufung auf diese Antwort zum Stapelüberlauf.

Es ist eine ziemlich gute Möglichkeit, die Art der Änderung (A: Hinzugefügt, M: Geändert, D: Gelöscht) für jede Datei zu erhalten, die geändert wurde.

git diff --name-status
Akshay
quelle
4

Und wenn Sie die Ergebnisse irgendwie einschränken möchten, ist dies eine schöne:

$ git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'
delete mode 100644 blah/some_dir/file1 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file2 d3bfbbeba5b5c1da73c432cb3fb61990bdcf6f64
delete mode 100644 blah/some_dir/file3 9c89b91d8df7c95c6043184154c476623414fcb7

Sie erhalten alle Dateien, aus denen gelöscht wurde some_dir(siehe Befehl sed), zusammen mit der Festschreibungsnummer, in der dies geschieht. Jeder sed regex reicht aus (ich benutze dies, um gelöschte Dateitypen usw. zu finden)

estani
quelle
2
Ich glaube, das ist viel zu kompliziert, um im täglichen Entwicklerleben nützlich zu sein. Wenn Sie stattdessen Dateien auflisten möchten, die aus dem aktuellen Verzeichnis gelöscht wurden, gehen Sie einfach wie git log --diff-filter=D .
folgt vor
Der Fall, den ich hatte, war, dass das Verzeichnis auch entfernt wurde und ich nur einen neuen Teil des Namens.
Estani
4

Da Windows keinen grepBefehl hat, hat dies in PowerShell für mich funktioniert:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt
James Skemp
quelle
Was ist Select-String?
MarcusJ
1
Es ist ein PowerShell-Cmdlet. Siehe docs.microsoft.com/en-us/powershell/module/…
James Skemp
Windows hat FIND und FINDSTR , obwohl ich zugeben muss, dass ich sie nie benutzt habe. Die Installation von Git Bash ist der einfachste Weg. Eine Alternative ist der aufgeblähte Cygwin .
Peter Mortensen
4

Alle gelöschten Dateien in some_branch anzeigen

git diff origin/master...origin/some_branch --name-status | grep ^D

oder

git diff origin/master...origin/some_branch --name-status --diff-filter=D 
vix2
quelle
2
Dies würde nicht funktionieren, da es alle Dateien mit einem D enthalten würde. Sie brauchen so etwas wie git diff origin/master...origin/some_branch --name-status | grep ^Dodergit diff origin/master...origin/some_branch --name-status --diff-filter=D
Nathaneastwood
1

Dadurch erhalten Sie eine Liste aller Dateien, die in allen Zweigen gelöscht wurden, sortiert nach ihrem Pfad:

git log --diff-filter=D --summary | grep "delete mode 100" | cut -c 21- | sort > deleted.txt

Funktioniert in msysgit (2.6.1.windows.1). Beachten Sie, dass wir "Löschmodus 100" benötigen, da Git-Dateien möglicherweise als Modus 100644 oder 100755 festgeschrieben wurden.

Mr_and_Mrs_D
quelle