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

400

我知道Git会存储文件何时被删除的信息,我可以检查单个提交以查看删除了哪些文件,但是否有一条命令可以生成在整个代码库历史中删除的每个文件的列表?


对于那些偶然发现这个答案但只是想查看从一个提交哈希或分支到另一个提交哈希或分支所添加、重命名、删除、修改等文件列表的人,请执行以下操作:git diff --name-status commit_hash - Gabriel Staples
9个回答

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

查看在Git仓库中查找和恢复已删除文件

如果您不想得到有关它们被删除的提交信息,您只需添加一个grep delete即可。

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

18
警告:这会列出你已删除的任何文件。如果你已删除一个文件,然后创建了一个同名的新文件,即使有一个现存的文件,它也会显示在这个列表中。 - T.J. Crowder
35
你还应该查看 git whatchanged 命令,它相当不错。 - Mr.Black
8
这将列出重命名的文件作为删除文件。要跳过这些,请使用 git log --find-renames --diff-filter=D --summary | grep delete - Slaven Rezic
3
默认情况下,使用 Git 2.9 版本时会启用重命名检测。若要将这些重命名文件再次显示为删除文件,请使用“git log --no-renames --diff-filter=D --summary | grep delete”命令。 - Michael Große
2
注意不要使用 grep delete,因为如果提交信息中包含单词 delete,它也会被选中。请改用 grep 'delete mode' - Vadim
显示剩余4条评论

109

我认为这个代码可以达到你想要的效果:

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

这些内容基本上是从此答案中直接提取的。

这只打印文件路径而没有其他信息:

BETA.md
CONTRIBUTING.md
files/en-us/api/file_api/index.html
files/en-us/games/index/index.md
files/en-us/games/visual-js_game_engine/index.html
files/en-us/games/visual_js_ge/index.html
files/en-us/games/visual_typescript_game_engine/index.html
...

50

如果你只想查看当前已删除的文件,可以使用以下代码:

git ls-files --deleted

如果你想要删除它们(假设你没有使用 "git rm" 命令删除它们),则可以将结果通过管道传递给 xargs git rm 命令。

git ls-files --deleted | xargs git rm

11
这显示了索引中已被删除的文件,但在工作副本中已不存在。操作者想要所有曾经被删除过的文件。 - Max Nanasy
1
或者 git rm $(git ls-files --deleted) - yunzen
5
尽管这不是原帖作者想要的,但对我自己仍然有用,因为我在搜索时遇到了表述问题。 - solstice333

22

引用这个 Stack Overflow 回答。

这是一种很妙的方法,可以获取每个更改了的文件的变更类型(A:新增,M:修改,D:删除)

git diff --name-status HEAD~1000

5

由于Windows系统没有grep命令,所以我在PowerShell中使用了以下命令:

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

什么是 Select-String - MarcusJ
4
这是一个PowerShell命令。请查看https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?view=powershell-5.1。 - James Skemp
Windows有FINDFINDSTR,虽然我必须承认我从未使用过它们。安装Git Bash是最简单的方法。另一种选择是臃肿的Cygwin - Peter Mortensen

5
显示在 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 

3
这种方法不会起作用,因为它会包含所有带有 D 的文件。你需要像这样使用 git diff origin/master...origin/some_branch --name-status | grep ^D 或者 git diff origin/master...origin/some_branch --name-status --diff-filter=D - nathaneastwood

5

如果您希望在某种程度上限制结果,这是一个不错的方法:

$ 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

2
这将为您提供一个列表,其中包含所有分支中已删除的所有文件,并按其路径排序:
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。


1
如果您想要将名称纯粹地用换行符分隔开,可以像这样使用--name-only标志:
git diff --diff-filter=D --name-only <old-commit-hash> <new-commit-hash>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接