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

如何使用pygit2获取diff中每个文件的变更行数统计数据

pygit2获取单文件diff变更统计的实现方法

完全可以实现该需求,你只需要遍历diff对象下的patches序列而非仅遍历deltas,每个Patch对象本身就携带了对应文件的插入、删除行数统计数据。

修改后的实现代码

from pygit2 import Repository

def get_diff_stats(repo_path, commit_a, commit_b):
    repo = Repository(f"{repo_path}/.git")
    diff = repo.diff(commit_a, commit_b)
    # 总统计和原逻辑一致
    print("总变更文件数:", diff.stats.files_changed)
    print("总插入行数:", diff.stats.insertions)
    print("总删除行数:", diff.stats.deletions)
    print("\n各文件变更详情:")
    # 遍历每个patch获取单文件统计
    for patch in diff:
        # 处理文件路径:删除的文件取旧路径,其他情况取新路径
        file_path = patch.delta.new_file.path if patch.delta.status_char() != 'D' else patch.delta.old_file.path
        status = patch.delta.status_char()
        insertions = patch.line_stats[1]
        deletions = patch.line_stats[2]
        print(f"{file_path} [{status}]: +{insertions} -{deletions}")

关键属性说明

  • diff对象本身可直接迭代,每次返回对应单个文件的Patch实例
  • Patch.line_stats是一个三元组,格式为(总行数, 插入行数, 删除行数)
  • 保留了原有的delta相关属性,你仍然可以获取文件状态、新旧路径等信息
  • 输出格式和git diff --stats的单文件统计结果完全一致

低版本兼容方案(可选)

如果你的pygit2版本较低没有line_stats属性,可以手动统计每个hunk的行变更:

insertions = 0
deletions = 0
for hunk in patch.hunks:
    for line in hunk.lines:
        if line.origin == '+':
            insertions += 1
        elif line.origin == '-':
            deletions += 1

内容的提问来源于stack exchange,提问作者Nasif Imtiaz Ohi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:42:02