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?


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

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,


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

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

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


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

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 

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.