You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:24:02