如何列出Git分支历史中已删除且未重新添加的文件?
如何列出Git中曾被删除且当前分支最新提交不存在的文件
原命令git log --all --pretty=format: --name-only --diff-filter=D会列出所有历史中被删除过的文件,但无法排除那些删除后又被重新添加的文件(比如示例里的aaa.txt)。以下是满足需求的解决方案:
仅输出符合条件的文件名
执行以下命令,会仅列出曾被删除且当前分支最新提交中不存在的文件:
git log --diff-filter=D --pretty=format: --name-only | sort | uniq -c | while read count file; do if ! git ls-files --error-unmatch "$file" > /dev/null 2>&1; then echo "$file" fi done
逻辑说明
git log --diff-filter=D --pretty=format: --name-only:筛选出所有包含文件删除操作的提交,仅提取被删除的文件名sort | uniq -c:对文件名去重,统计每个文件被删除的次数- 循环检查每个文件:用
git ls-files --error-unmatch判断文件是否存在于当前分支的最新提交中,不存在则输出文件名
结合你的示例执行后,只会输出bbb.txt,符合预期。
同时显示文件被删除的最近提交
如果需要同时查看文件被删除的最近提交信息(哈希+提交说明),可以用以下命令:
git log --diff-filter=D --name-only --pretty=format:"%h %s" | awk '/^[0-9a-f]/ {commit=$0; next} {files[$0] = commit} END {for (f in files) {if (system("git ls-files --error-unmatch \"" f "\" > /dev/null 2>&1") != 0) print files[f], f}}'
逻辑说明
git log --diff-filter=D --name-only --pretty=format:"%h %s":捕获每个删除提交的简短哈希、提交说明,以及对应的被删除文件名- 通过
awk将每个文件关联到它被删除的最近提交 - 最后检查文件是否存在于当前最新提交,不存在则输出对应的提交信息和文件名
在你的示例中执行后,会输出类似:
abc1234 delete aaa.txt, bbb.txt bbb.txt
内容的提问来源于stack exchange,提问作者mclayton
相关产品推荐
相关产品推荐

