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

如何在Git存储库中列出所有已删除的文件?,git,Git,我知道Git存储文件被删除时的信息,并且我能够检查各个提交以查看哪些文件已被删除,但是是否有一个命令可以生成存储库生命周期内每个已删除文件的列表 git log --diff-filter=D --summary 看 如果您不想获得有关删除它们的提交的所有信息,您可以在其中添加一个grep delete git log --diff-filter=D --summary | grep delete 这正是你想要的,我认为: git log --all --pretty=format: --n

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

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

如果您不想获得有关删除它们的提交的所有信息,您可以在其中添加一个
grep delete

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

这正是你想要的,我认为:

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

。。。这是我刚才或多或少直接从中获取的。

如果您只对查看当前删除的文件感兴趣,可以使用以下方法:

git ls-files --deleted
如果您想删除它们(如果您不使用“git-rm”删除它们),请将结果传输到xargs-git-rm

git ls-files --deleted | xargs git rm

如果你想以某种方式限制结果,这里有一个很好的例子:

$ 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正则表达式都可以(我使用它查找已删除的文件类型等)

答案

这是一种非常简洁的方法,可以为每个被更改的文件获取更改类型(a:Added,M:Modified,D:Deleted)

git diff --name-status

这将获得所有分支中删除的所有文件的列表,按路径排序:

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。

由于Windows没有
grep
命令,这在PowerShell中对我有效:

git log --find-renames --diff-filter=D --summary | Select-String -Pattern "delete mode" | sort -u > deletions.txt
显示某些分支中所有已删除的文件


这仅显示索引中已在工作副本中删除的文件。OP想要所有曾经被删除过的文件。或者
git rm$(git ls files--deleted)
尽管这不是OP想要的,但这至少对我自己有用,因为我在搜索警告中无法正确地表达我的查询:这列出了你删除的所有文件。如果您删除了一个文件,然后创建了一个同名的新文件,它将显示在此列表中,即使其中有一个现存的文件。您还应该查看git whatchanged命令。这很酷。这也会将重命名列为删除。要跳过这些,请使用git日志--find renames--diff filter=D--summary | grep delete和git 2.9,默认情况下会激活重命名检测。要将这些再次视为删除,请使用
git log--no-renames--diff filter=D--summary | grep delete
小心使用
grep delete
,因为如果提交消息包含单词delete,它也会被拾取。使用
grep'delete mode'
代替。我相信这是一种在日常开发者生活中非常有用的方法。相反,如果您想列出从当前目录中删除的文件,只需执行以下操作:
git log--diff filter=D。
我遇到的情况是,该目录也被删除,我只是名称的新部分。什么是
Select String
?这是一个PowerShell cmdlet。我必须承认,我从来没有用过窗户。安装是最简单的方法。另一种选择是臃肿。这不起作用,因为它将包含所有带有D的文件。您需要类似于
git diff origin/master…origin/some_branch--name status | grep^D
git diff origin/master…origin/some_branch--name status--diff filter=D
的内容,以供任何在这个答案上遇到障碍的人使用,但只要查看添加、重命名、删除、修改等文件的列表,从一个提交散列或分支到另一个,执行以下操作:
git diff--name status commit\u hash
git diff origin/master...origin/some_branch --name-status | grep ^D
git diff origin/master...origin/some_branch --name-status --diff-filter=D