如何使用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
相关产品推荐
相关产品推荐

