如何通过GitPython API检测被Git标记为删除的文件
解决方案
你之前测试deleted_file属性不符合预期,是因为只做了暂存区和工作区的单维度比对,漏了HEAD和暂存区的比对范围,无法覆盖已暂存的删除场景。可通过两次diff覆盖D (已暂存删除)、 D(未暂存删除)两种状态,实现代码如下:
import git from functools import lru_cache @lru_cache(maxsize=1) def _get_all_deleted_files(): # 自动搜索当前目录对应的Git仓库 repo = git.Repo(search_parent_directories=True) deleted_files = set() # 匹配 git status 中 "D " 状态:删除操作已提交到暂存区 staged_diff = repo.index.diff("HEAD") for diff_item in staged_diff: if diff_item.change_type == "D": deleted_files.add(diff_item.a_path) # 匹配 git status 中 " D" 状态:工作区删除但未暂存 unstaged_diff = repo.index.diff(None) for diff_item in unstaged_diff: if diff_item.change_type == "D": deleted_files.add(diff_item.a_path) return deleted_files def _is_deleted(path: str) -> bool: return path in _get_all_deleted_files()
逻辑说明
repo.index.diff("HEAD")比对暂存区和最后一次提交的差异,能抓到已经git add的删除操作repo.index.diff(None)比对暂存区和工作区的差异,能抓到未暂存的本地删除操作- 用
change_type == 'D'判断删除状态,比deleted_file属性兼容性更好,和Git底层状态标识完全对齐
内容的提问来源于stack exchange,提问作者Philippe Hebert
相关产品推荐
相关产品推荐

