快速获取每个提交文件子集的 changed/deleted 行数的方法

Fast way to get number of changed/deleted lines per subset of files per commit

我正在用 GitPython 做一些源代码分析。 对于每次提交,我都会像这样查看每个 .java 文件的内容:

from git import Repo 
repo = Repo.init('/path/to/repo', bare=True)
for commit in repo.iter_commits():
    for obj in commit.tree.traverse(predicate = lambda obj, depth: obj.type == 'blob' and obj.name.endswith('.java')):
        content = obj.data_stream.read().decode("CP437")
        #...

这已经非常快速和可靠了。 但是,当我尝试另外获取这些文件的更改和删除代码行数时,速度会慢得多。更准确地说,我尝试了内部调用 git diff --numstatcommit.stats.files。这基本上正是我想要的(我可以很容易地过滤 .java 文件),但是对于上面代码需要 ~5s 的 repo,添加 commit.stats.files 将时间增加到 ~140s,这对于更大的文件是不可行的回购

所以我的问题是:您是否有关于获取所有提交的所有 .java 文件的差异代码行的聪明而快速的方法的想法?
我不需要完整的差异,只需要行数...

最好不要将旧代码的 运行 时间增加超过 2 倍。

在您的终端中尝试 运行ning git log --numstatgit log --numstat > stats.txt

如果运行宁时间可以接受:

  • 检查 运行 从 gitpython 使用相同的命令是否也可以在性能方面发挥作用(git = new Git(...); git.log('-numstat', ...)(如果不可接受:运行 使用 os.exec ... 的命令)
  • 解析此命令的输出