Làm cách nào để liệt kê tất cả các tệp đã xóa trong kho Git?


306

Tôi biết Git lưu trữ thông tin về thời điểm các tệp bị xóa và tôi có thể kiểm tra các cam kết riêng lẻ để xem các tệp nào đã bị xóa, nhưng có lệnh nào sẽ tạo danh sách mọi tệp bị xóa trong suốt tuổi thọ của kho lưu trữ không?


Đối với bất kỳ ai vấp phải câu trả lời này nhưng chỉ muốn xem danh sách các tệp được thêm, đổi tên, xóa, sửa đổi, v.v., từ một hàm băm hoặc nhánh này sang một nhánh khác, hãy làm điều này : git diff --name-status commit_hash.
Gabriel Staples

Câu trả lời:


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

Xem Tìm và khôi phục tệp đã xóa trong kho Git

Nếu bạn không muốn tất cả thông tin về những cam kết mà họ đã bị xóa, bạn chỉ có thể thêm một thông tin grep deletevào đó.

git log --diff-filter=D --summary | grep delete

13
Cảnh báo: Điều này liệt kê bất kỳ tập tin bạn đã xóa. Nếu bạn đã xóa một tệp, sau đó tạo một tệp mới có cùng tên, nó sẽ hiển thị trong danh sách này, mặc dù có một tệp còn tồn tại ở đó.
TJ Crowder

24
Bạn cũng nên nhìn vào lệnh git whatchanged . Nó thật tuyệt
Mr.Black

6
Điều này cũng sẽ liệt kê các tên đổi là xóa. Để bỏ qua việc sử dụng nàygit log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic 21/07/2015

2
Với git 2.9, phát hiện đổi tên được kích hoạt theo mặc định. Để xem lại những lần này khi sử dụng xóagit log --no-renames --diff-filter=D --summary | grep delete
Michael Große

2
Cẩn thận khi sử dụng grep deletevì nếu thông điệp cam kết có từ xóa, nó cũng sẽ được chọn. Sử dụng grep 'delete mode'thay thế.
Vadim


37

Nếu bạn chỉ muốn xem các tệp hiện đang bị xóa, bạn có thể sử dụng:

git ls-files --deleted

nếu sau đó bạn muốn xóa chúng (trong trường hợp bạn đã xóa chúng không sử dụng đường ống "git rm") dẫn đến xargs git rm

git ls-files --deleted | xargs git rm

11
Điều này chỉ hiển thị các tệp trong chỉ mục đã bị xóa trong bản sao làm việc. OP muốn tất cả các tệp đã bị xóa.
Tối đa Nanasy

1
hoặcgit rm $(git ls-files --deleted)
yunzen 8/07/2015

mặc dù đó không phải là điều OP muốn, nhưng điều này ít nhất vẫn hữu ích cho bản thân tôi, vì tôi gặp khó khăn khi thực hiện truy vấn của mình đúng cách trong một tìm kiếm
solstice333 ngày

10

Trích dẫn này câu trả lời Stack Overflow.

Đây là một cách khá gọn gàng để có được loại thay đổi (A: Đã thêm, M: Đã sửa đổi, D: Đã xóa) cho mỗi tệp đã thay đổi.

git diff --name-status

4

Và nếu bạn muốn bằng cách nào đó hạn chế kết quả thì đây là một kết quả hay:

$ 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

Bạn sẽ nhận được tất cả các tệp bị xóa khỏi some_dir(xem lệnh sed) cùng với số cam kết trong đó xảy ra. Bất kỳ regex sed nào cũng được (Tôi sử dụng điều này để tìm các loại tệp đã bị xóa, v.v.)


2
Tôi tin rằng đó là cách phức tạp để có ích trong cuộc sống hàng ngày của nhà phát triển. Thay vào đó, nếu bạn muốn liệt kê các tập tin bị xóa khỏi thư mục hiện tại, chỉ cần làm:git log --diff-filter=D .
Sebi

Trường hợp tôi có là thư mục cũng bị xóa và tôi chỉ là một phần mới của tên.
estani

4

Vì Windows không có greplệnh, điều này làm việc với tôi trong PowerShell:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt

Select-String
MarcusJ

1
Đó là một lệnh ghép ngắn PowerShell. Xem docs.microsoft.com/en-us/powershell/module/ Kẻ
James Skemp

Windows có TÌMTÌM KIẾM , mặc dù tôi phải thừa nhận rằng tôi chưa bao giờ sử dụng chúng. Cài đặt Git Bash là cách dễ nhất. Một thay thế là Cygwin cồng kềnh .
Peter Mortensen

4

Hiển thị tất cả các tệp đã bị xóa trong some_branch

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

hoặc là

git diff origin/master...origin/some_branch --name-status --diff-filter=D 

2
Điều này sẽ không hoạt động vì nó sẽ chứa tất cả các tệp có D trong đó. Bạn cần một cái gì đó như git diff origin/master...origin/some_branch --name-status | grep ^Dhoặcgit diff origin/master...origin/some_branch --name-status --diff-filter=D
nathaneastwood

1

Điều này sẽ giúp bạn có một danh sách tất cả các tệp đã bị xóa trong tất cả các nhánh, được sắp xếp theo đường dẫn của chúng:

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

Hoạt động trong msysgit (2.6.1.windows.1). Lưu ý rằng chúng tôi cần "xóa chế độ 100" vì các tệp git có thể đã được cam kết là chế độ 100644 hoặc 100755.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.