快速获取每个提交文件子集的 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 --numstat
的 commit.stats.files
。这基本上正是我想要的(我可以很容易地过滤 .java 文件),但是对于上面代码需要 ~5s 的 repo,添加 commit.stats.files
将时间增加到 ~140s,这对于更大的文件是不可行的回购
所以我的问题是:您是否有关于获取所有提交的所有 .java 文件的差异代码行的聪明而快速的方法的想法?
我不需要完整的差异,只需要行数...
最好不要将旧代码的 运行 时间增加超过 2 倍。
在您的终端中尝试 运行ning git log --numstat
或 git log --numstat > stats.txt
。
如果运行宁时间可以接受:
- 检查 运行 从 gitpython 使用相同的命令是否也可以在性能方面发挥作用(
git = new Git(...); git.log('-numstat', ...)
(如果不可接受:运行 使用 os.exec ...
的命令)
- 解析此命令的输出
我正在用 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 --numstat
的 commit.stats.files
。这基本上正是我想要的(我可以很容易地过滤 .java 文件),但是对于上面代码需要 ~5s 的 repo,添加 commit.stats.files
将时间增加到 ~140s,这对于更大的文件是不可行的回购
所以我的问题是:您是否有关于获取所有提交的所有 .java 文件的差异代码行的聪明而快速的方法的想法?
我不需要完整的差异,只需要行数...
最好不要将旧代码的 运行 时间增加超过 2 倍。
在您的终端中尝试 运行ning git log --numstat
或 git log --numstat > stats.txt
。
如果运行宁时间可以接受:
- 检查 运行 从 gitpython 使用相同的命令是否也可以在性能方面发挥作用(
git = new Git(...); git.log('-numstat', ...)
(如果不可接受:运行 使用os.exec ...
的命令) - 解析此命令的输出