如何列出Git存储库中所有已删除的文件?


304

我知道Git会存储有关何时删除文件的信息,并且我能够检查单个提交以查看哪些文件已删除,但是是否有一条命令可以生成存储库生命周期中每个已删除文件的列表?


对于绊脚石这个答案,但只是希望查看从一个提交哈希或分支到另一个提交哈希或分支的文件列表的添加,重命名,删除,修改等,请执行以下操作:git diff --name-status commit_hash
加布里埃尔·斯台普斯

Answers:


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

请参阅在Git存储库中查找和恢复已删除的文件

如果您不希望获得有关删除了哪些提交的所有信息,则可以在其中添加一个grep delete

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

13
警告:这会列出您已删除的所有文件。如果您删除了文件,然后创建了一个具有相同名称的新文件,即使那里已有文件,它也会显示在此列表中。
TJ Crowder 2014年

24
您还应该查看git whatchanged命令。它太酷了。
布莱克先生

6
这还将列出重命名为删除。跳过这些使用git log --find-renames --diff-filter=D --summary | grep delete
Slaven Rezic 2015年

2
使用git 2.9时,默认情况下会激活重命名检测。要再次看到这些如删除使用git log --no-renames --diff-filter=D --summary | grep delete
迈克尔街道Große

2
当心使用,grep delete因为如果提交消息中包含单词delete,它也会被拾取。使用grep 'delete mode'代替。
Vadim


37

如果您只想查看当前已删除的文件,可以使用以下方法:

git ls-files --deleted

如果您随后想要删除它们(如果不使用“ git rm”删除了它们),则会导致生成xargs git rm

git ls-files --deleted | xargs git rm

11
这仅显示索引中已在工作副本中删除的文件。OP希望删除所有曾经删除过的文件。
Max Nanasy 2012年

1
git rm $(git ls-files --deleted)
yunzen 2015年

即使这不是OP想要的,但至少对我自己来说还是有用的,因为我在搜索中很难正确地表达查询的
solstice333

10

引用堆栈溢出答案。

这是一种为每个被更改的文件获取更改类型(A:已添加,M:已修改,D:已删除)的好方法。

git diff --name-status

4

如果您想以某种方式限制结果,那么这里是一个不错的选择:

$ 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

您将删除所有文件some_dir(请参阅sed命令)以及提交时的提交编号。任何sed正则表达式都可以(我用它来查找已删除的文件类型,等等)


2
我相信,这种方式在日常的开发人员生活中变得有用。相反,如果您要列出从当前目录中删除的文件,请执行以下操作:git log --diff-filter=D .
Sebi

我遇到的情况是该目录也已删除,而我只是该名称的新部分。
estani 2015年

4

由于Windows没有grep命令,因此在PowerShell中对我有用:

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

什么Select-String
MarcusJ

1
这是一个PowerShell cmdlet。见docs.microsoft.com/en-us/powershell/module/...
詹姆斯Skemp

Windows具有FINDFINDSTR,尽管我必须承认我从未使用过它们。安装Git Bash是最简单的方法。另一种是is肿的Cygwin
彼得·莫滕森

4

显示some_branch中所有已删除的文件

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

要么

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

2
这将不起作用,因为它将包含所有带有D的文件。您需要类似git diff origin/master...origin/some_branch --name-status | grep ^Dgit diff origin/master...origin/some_branch --name-status --diff-filter=D
nathaneastwood

1

这将为您提供所有分支中已删除的所有文件的列表,并按其路径排序:

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

在msysgit(2.6.1.windows.1)中工作。请注意,我们需要“删除模式100”,因为git文件可能已提交为模式100644或100755。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.