Jak mogę wyświetlić listę wszystkich usuniętych plików w repozytorium Git?

304

Wiem, że Git przechowuje informacje o tym, kiedy pliki są usuwane, i jestem w stanie sprawdzić poszczególne zatwierdzenia, aby zobaczyć, które pliki zostały usunięte, ale czy istnieje polecenie, które wygeneruje listę każdego usuniętego pliku w całym okresie życia repozytorium?

Toby
źródło
Na każdy przeszkodą na tej odpowiedzi, ale po prostu chcą zobaczyć listę plików dodanych, przemianowane, usunięte, zmodyfikowanych, itp, z jednym popełnić hash lub oddziału do drugiego, to zrobić: git diff --name-status commit_hash.
Gabriel Staples

Odpowiedzi:

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

Zobacz Znajdź i przywróć usunięty plik w repozytorium Git

Jeśli nie chcesz wszystkich informacji o zatwierdzeniu, w którym zostały usunięte, możesz po prostu dodać grep deletetam.

git log --diff-filter=D --summary | grep delete
I82 Wiele
źródło
13
Ostrzeżenie: zawiera listę wszystkich usuniętych plików. Jeśli usunąłeś plik, a następnie utworzyłeś nowy plik o tej samej nazwie, pojawi się on na tej liście, mimo że istnieje tam istniejący plik.
TJ Crowder,
24
Powinieneś także spojrzeć na polecenie git whatchanged . To całkiem fajne.
Mr.Black
6
Spowoduje to także wyświetlenie nazw nazw jako usuniętych. Aby pominąć te użyciegit log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic
2
W git 2.9 wykrywanie nazw jest aktywowane domyślnie. Aby zobaczyć je ponownie jako skasowane, użyjgit log --no-renames --diff-filter=D --summary | grep delete
Michael Große
2
Uważaj przy użyciu, grep deleteponieważ jeśli wiadomość zatwierdzenia zawiera słowo „usuń”, zostanie również odebrana. Użyj grep 'delete mode'zamiast tego.
Vadim,
85

To robi, co chcesz, myślę:

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

... które właśnie wziąłem mniej więcej bezpośrednio z tej drugiej odpowiedzi .

Mark Longair
źródło
37

Jeśli chcesz zobaczyć tylko aktualnie usunięte pliki, możesz użyć tego:

git ls-files --deleted

jeśli chcesz je usunąć (na wypadek, gdybyś je usunął nie używając „git rm”) potok, który prowadzi do xargs git rm

git ls-files --deleted | xargs git rm
Jim Clouse
źródło
11
Pokazuje tylko pliki w indeksie, które zostały usunięte w kopii roboczej. OP chce wszystkich plików, które kiedykolwiek zostały usunięte.
Max Nanasy,
1
lubgit rm $(git ls-files --deleted)
Junzen
mimo że nie tego chciał OP, nadal było to przydatne przynajmniej dla mnie, ponieważ miałem problem z poprawnym sformułowaniem zapytania podczas wyszukiwania
przesilenie
10

Cytując odpowiedź przepełnienia stosu.

Jest to całkiem fajny sposób na uzyskanie typu zmiany (A: Dodano, M: Zmodyfikowano, D: Usunięto) dla każdego pliku, który został zmieniony.

git diff --name-status
akshay
źródło
4

A jeśli chcesz w jakiś sposób ograniczyć wyniki, oto fajny:

$ 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

Wszystkie pliki zostaną usunięte z some_dir(patrz polecenie sed) wraz z numerem zatwierdzenia, w którym się to wydarzyło. Zrobi to każde wyrażenie regularne (używam tego do znajdowania usuniętych typów plików itp.)

estani
źródło
2
Uważam, że jest to zbyt skomplikowane, aby być użytecznym w codziennym życiu programistów. Zamiast tego, jeśli chcesz wyświetlić listę plików usuniętych z bieżącego katalogu, po prostu wykonaj:git log --diff-filter=D .
Sebi
Miałem przypadek, że katalog został również usunięty, a ja po prostu nową część nazwy.
estani
4

Ponieważ Windows nie ma greppolecenia, działało to dla mnie w PowerShell:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt
James Skemp
źródło
Co to jest Select-String?
MarcusJ
1
To polecenie cmdlet programu PowerShell. Zobacz docs.microsoft.com/en-us/powershell/module/…
James Skemp,
Windows ma FIND i FINDSTR , choć muszę przyznać, że nigdy ich nie używałem. Instalacja Git Bash jest najprostszym sposobem. Alternatywą jest nadęty Cygwin .
Peter Mortensen
4

Pokaż wszystkie usunięte pliki w some_branch

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

lub

git diff origin/master...origin/some_branch --name-status --diff-filter=D 
vix2
źródło
2
To nie zadziałałoby, ponieważ zawierałoby wszystkie pliki z literą D. Potrzebujesz czegoś takiego git diff origin/master...origin/some_branch --name-status | grep ^Dlubgit diff origin/master...origin/some_branch --name-status --diff-filter=D
nathaneastwood
1

Spowoduje to wyświetlenie listy wszystkich plików, które zostały usunięte we wszystkich gałęziach, posortowanych według ścieżki:

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

Działa w msysgit (2.6.1.windows.1). Uwaga: potrzebujemy „trybu usuwania 100”, ponieważ pliki git mogły zostać zatwierdzone jako tryb 100644 lub 100755.

Mr_i_Mrs_D
źródło